Share via


/CLRSUPPORTLASTERROR (保留 PInvoke 呼叫的最後一個錯誤碼)

/CLRSUPPORTLASTERROR,預設為開啟,會保留透過 P/Invoke 機制呼叫之函式的最後一個錯誤碼,這可讓您從使用 /clr 編譯的程式碼呼叫 DLLS 中的原生函式。

語法

/CLRSUPPORTLASTERROR
/CLRSUPPORTLASTERROR:NO
/CLRSUPPORTLASTERROR:SYSTEMDLL

備註

保留最後一個錯誤碼表示效能降低。 如果您不想產生保留最後一個錯誤碼的效能成本,請使用 /CLRSUPPORTLASTERROR:NO 連結。

您可以連結 至 /CLRSUPPORTLASTERROR:SYSTEMDLL ,以將效能降低到最低,這只會保留系統 DLL 中函式的最後一個錯誤碼。

注意

相同模組中 CLR 程式碼所取用的 Unmanaged 函式不支援保留最後一個錯誤。

在 Visual Studio 開發環境中設定這個連結器選項

  1. 開啟專案的 [ 屬性頁 ] 對話方塊。 如需詳細資訊,請參閱 設定編譯器和建置屬性

  2. 選取 [組態屬性 > ] 連結器 > [ 進階 ] 屬性頁。

  3. 修改 PInvoke 呼叫 屬性的 保留最後一個錯誤碼。 選擇 [確定 ] 或 [ 套用 ] 以儲存您的變更。

若要以程式設計方式設定這個連結器選項

範例

下列範例會定義原生 DLL,其中一個匯出的函式會修改最後一個錯誤。

// CLRSUPPORTLASTERROR_dll.cpp
// compile with: /LD
#include <windows.h>
#include <math.h>

#pragma unmanaged
__declspec(dllexport) double MySqrt(__int64 n) {
   SetLastError(DWORD(-1));
   return sqrt(double(n));
}

下列範例會取用 DLL,示範如何使用 /CLRSUPPORTLASTERROR

// CLRSUPPORTLASTERROR_client.cpp
// compile with: /clr CLRSUPPORTLASTERROR_dll.lib /link /clrsupportlasterror:systemdll
// processor: x86
#include <windows.h>
#include <wininet.h>
#include <stdio.h>
#include <math.h>

#pragma comment(lib, "wininet.lib")

double MySqrt(__int64 n);

#pragma managed
int main() {
   double   d = 0.0;
   __int64 n = 65;
   HANDLE  hGroup = NULL;
   GROUPID groupID;
   DWORD   dwSet = 127, dwGet = 37;

   SetLastError(dwSet);
   d = MySqrt(n);
   dwGet = GetLastError();

   if (dwGet == DWORD(-1))
      printf_s("GetLastError for application call succeeded (%d).\n",
             dwGet);
   else
      printf_s("GetLastError for application call failed (%d).\n",
             dwGet);

   hGroup = FindFirstUrlCacheGroup(0, CACHEGROUP_SEARCH_ALL,
                           0, 0, &groupID, 0);
   dwGet = GetLastError();
   if (dwGet == 183)
      printf_s("GetLastError for system call succeeded (%d).\n",
             dwGet);
   else
      printf_s("GetLastError for system call failed (%d).\n",
             dwGet);
}
GetLastError for application call failed (127).
GetLastError for system call succeeded (183).

另請參閱

MSVC 連結器參考
MSVC 連結器選項