Share via


/CLRSUPPORTLASTERROR (Mantieni ultimo codice di errore per le chiamate PInvoke)

/CLRSUPPORTLASTERROR, che è attivato per impostazione predefinita, mantiene l'ultimo codice di errore delle funzioni chiamate tramite il meccanismo P/Invoke, che consente di chiamare funzioni native in DLLS, dal codice compilato con /clr.

Sintassi

/CLRSUPPORTLASTERROR
/CLRSUPPORTLASTERROR:NO
/CLRSUPPORTLASTERROR:SYSTEMDLL

Osservazioni:

Il mantenimento dell'ultimo codice di errore implica una riduzione delle prestazioni. Se non si vuole sostenere il costo delle prestazioni per mantenere l'ultimo codice di errore, collegare tramite /CLRSUPPORTLASTERROR:NO.

È possibile ridurre al minimo la riduzione delle prestazioni collegando con /CLRSUPPORTLASTERROR:SYSTEMDLL, che mantiene solo l'ultimo codice di errore per le funzioni nelle DLL di sistema.

Nota

Il mantenimento dell'ultimo errore non è supportato per le funzioni non gestite utilizzate dal codice CLR nello stesso modulo.

Per impostare questa opzione del linker nell'ambiente di sviluppo di Visual Studio

  1. Aprire la finestra di dialogo Pagine delle proprietà per il progetto. Per altre informazioni, vedere Impostare le proprietà del compilatore e della compilazione.

  2. Selezionare la pagina delle>proprietà Proprietà di configurazione Linker>Avanzate.

  3. Modificare la proprietà Preserve Last Error Code for PInvoke Calls .Modify the Preserve Last Error Code for PInvoke Calls property. Scegliere OK o Applica per salvare le modifiche.

Per impostare l'opzione del linker a livello di codice

Esempi

L'esempio seguente definisce una DLL nativa con una funzione esportata che modifica l'ultimo errore.

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

Nell'esempio seguente viene utilizzata la DLL, che illustra come usare /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).

Vedi anche

Informazioni di riferimento sul linker MSVC
Opzioni del linker MSVC