/CLRSUPPORTLASTERROR
(Zachování kódu poslední chyby pro volání PInvoke)
/CLRSUPPORTLASTERROR
, který je ve výchozím nastavení zapnutý, zachovává poslední kód chyby funkcí volaných prostřednictvím mechanismu P/Invoke, který umožňuje volat nativní funkce v knihovně DLLS, z kódu zkompilovaného pomocí /clr
.
Syntaxe
/CLRSUPPORTLASTERROR
/CLRSUPPORTLASTERROR:NO
/CLRSUPPORTLASTERROR:SYSTEMDLL
Poznámky
Zachování posledního kódu chyby znamená snížení výkonu. Pokud nechcete, aby se náklady na výkon zachovaly při zachování posledního kódu chyby, použijte odkaz ./CLRSUPPORTLASTERROR:NO
Snížení výkonu můžete minimalizovat propojením , /CLRSUPPORTLASTERROR:SYSTEMDLL
který zachovává pouze poslední kód chyby pro funkce v systémových knihovnách DLL.
Poznámka:
Zachování poslední chyby není podporováno pro nespravované funkce, které kód CLR využívá ve stejném modulu.
- Další informace naleznete v tématu
/clr
(Common Language Runtime Compilation).
Nastavení tohoto parametru linkeru ve vývojovém prostředí sady Visual Studio
Otevřete dialogové okno Stránky vlastností projektu. Další informace naleznete v tématu Nastavení vlastností kompilátoru a sestavení.
Vyberte stránku vlastností linkeru>>Konfigurace Upřesňující vlastnost.
Upravte vlastnost Zachovat poslední kód chyby pro volání PInvoke. Změny uložíte kliknutím na OK nebo Použít .
Programové nastavení tohoto parametru linkeru
- Viz třída AdditionalOptions.
Příklady
Následující ukázka definuje nativní knihovnu DLL s jednou exportovanou funkcí, která upravuje poslední chybu.
// 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));
}
Následující ukázka využívá knihovnu DLL, která demonstruje způsob použití /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).