/CLRSUPPORTLASTERROR
(Letzten Fehlercode für PInvoke-Aufrufe beibehalten)
/CLRSUPPORTLASTERROR
, das standardmäßig aktiviert ist, behält den letzten Fehlercode von Funktionen bei, die über den P/Invoke-Mechanismus aufgerufen werden, wodurch Sie systemeigene Funktionen in DLLS aufrufen können, von Code der mit /clr
kompiliert wurde.
Syntax
/CLRSUPPORTLASTERROR
/CLRSUPPORTLASTERROR:NO
/CLRSUPPORTLASTERROR:SYSTEMDLL
Hinweise
Die Beibehaltung des letzten Fehlercodes impliziert eine Abnahme der Leistung. Wenn Sie nicht die Leistungskosten für die Beibehaltung des letzten Fehlercodes verursachen möchten, verknüpfen Sie die Verknüpfung mithilfe /CLRSUPPORTLASTERROR:NO
von .
Sie können die Leistungseinbußen minimieren, indem Sie eine Verknüpfung herstellen /CLRSUPPORTLASTERROR:SYSTEMDLL
, mit der nur der letzte Fehlercode für Funktionen in System-DLLs erhalten bleibt.
Hinweis
Die Beibehaltung des letzten Fehlers wird für nicht verwaltete Funktionen, die vom CLR-Code im selben Modul verwendet werden, nicht unterstützt.
- Weitere Informationen finden Sie unter
/clr
(Common Language Runtime Compilation).
So legen Sie diese Linkeroption in der Visual Studio-Entwicklungsumgebung fest
Öffnen Sie das Dialogfeld Eigenschaftenseiten für das Projekt. Weitere Informationen finden Sie unter Festlegen von Compiler- und Buildeigenschaften.
Wählen Sie die Seite "Konfigurationseigenschaften linker>>Advanced".
Ändern Sie den Letzten Fehlercode für die PInvoke Calls-Eigenschaft beibehalten. Wählen Sie OK oder Übernehmen, um die Änderungen zu speichern.
So legen Sie diese Linkeroption programmgesteuert fest
- Siehe AdditionalOptions.
Beispiele
Im folgenden Beispiel wird eine systemeigene DLL mit einer exportierten Funktion definiert, die den letzten Fehler ändert.
// 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));
}
Im folgenden Beispiel wird die DLL verwendet, die die Verwendung /CLRSUPPORTLASTERROR
veranschaulicht.
// 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).