Udostępnij za pośrednictwem


/CLRSUPPORTLASTERROR (Zachowaj kod ostatniego błędu dla wywołań PInvoke)

/CLRSUPPORTLASTERROR, który jest domyślnie włączony, zachowuje ostatni kod błędu funkcji wywoływanych za pomocą mechanizmu P/Invoke, który umożliwia wywoływanie funkcji natywnych w bibliotekach DLLS z kodu skompilowanego za pomocą /clrpolecenia .

Składnia

/CLRSUPPORTLASTERROR
/CLRSUPPORTLASTERROR:NO
/CLRSUPPORTLASTERROR:SYSTEMDLL

Uwagi

Zachowanie ostatniego kodu błędu oznacza spadek wydajności. Jeśli nie chcesz ponosić kosztów wydajności zachowania ostatniego kodu błędu, połącz się przy użyciu polecenia /CLRSUPPORTLASTERROR:NO.

Możesz zminimalizować karę wydajności, łącząc się z elementem /CLRSUPPORTLASTERROR:SYSTEMDLL, który zachowuje tylko ostatni kod błędu dla funkcji w bibliotekach DLL systemu.

Uwaga

Zachowanie ostatniego błędu nie jest obsługiwane w przypadku funkcji niezarządzanych, które są używane przez kod CLR w tym samym module.

Aby ustawić tę opcję konsolidatora w środowisku programowania Visual Studio

  1. Otwórz okno dialogowe Strony właściwości dla projektu. Aby uzyskać więcej informacji, zobacz Ustawianie właściwości kompilatora i kompilacji.

  2. Wybierz stronę właściwości Zaawansowane konsolidatora> właściwości>konfiguracji.

  3. Zmodyfikuj właściwość Zachowaj kod ostatniego błędu dla wywołań PInvoke. Wybierz przycisk OK lub Zastosuj , aby zapisać zmiany.

Aby programowo ustawić tę opcję konsolidatora

Przykłady

Poniższy przykład definiuje natywną bibliotekę DLL z jedną wyeksportowaną funkcją, która modyfikuje ostatni błąd.

// 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));
}

W poniższym przykładzie użyto biblioteki DLL, co pokazuje, jak używać biblioteki /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).

Zobacz też

Dokumentacja konsolidatora MSVC
Opcje konsolidatora MSVC