/CLRSUPPORTLASTERROR
(保留 PInvoke 呼叫的最後一個錯誤碼)
/CLRSUPPORTLASTERROR
,預設為開啟,會保留透過 P/Invoke 機制所呼叫函式的最後一個錯誤碼,這可讓您從 /clr
編譯的程式碼中呼叫 DLL 中的原生函式。
語法
/CLRSUPPORTLASTERROR
/CLRSUPPORTLASTERROR:NO
/CLRSUPPORTLASTERROR:SYSTEMDLL
備註
保留最後一個錯誤碼表示效能降低。 如果您不想產生保留最後一個錯誤碼的效能成本,請使用 /CLRSUPPORTLASTERROR:NO
連結。
您可以連結 至 /CLRSUPPORTLASTERROR:SYSTEMDLL
,以將效能降低到最低,這隻會保留系統 DLL 中函式的最後一個錯誤碼。
注意
相同模組中 CLR 程式代碼所取用的 Unmanaged 函式不支援保留最後一個錯誤。
- 如需詳細資訊,請參閱
/clr
(Common Language Runtime 編譯) 。
在 Visual Studio 開發環境中設定這個連結器選項
開啟專案的 [ 屬性頁 ] 對話框。 如需詳細資訊,請參閱 設定編譯程式和建置屬性。
選取 [組態屬性>] 連結器>[進階] 屬性頁。
修改 PInvoke 呼叫屬性的保留最後一個錯誤碼。 選擇 [確定] 或 [套用] 以儲存變更。
若要以程式設計方式設定這個連結器選項
- 請參閱 AdditionalOptions。
範例
下列範例會定義原生 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).