Teilen über


/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:NOvon .

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.

So legen Sie diese Linkeroption in der Visual Studio-Entwicklungsumgebung fest

  1. Öffnen Sie das Dialogfeld Eigenschaftenseiten für das Projekt. Weitere Informationen finden Sie unter Festlegen von Compiler- und Buildeigenschaften.

  2. Wählen Sie die Seite "Konfigurationseigenschaften linker>>Advanced".

  3. Ä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

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 /CLRSUPPORTLASTERRORveranschaulicht.

// 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).

Siehe auch

MSVC-Linkerreferenz
Linkeroptionen