/CLRSUPPORTLASTERROR (Conservar el último código de error para llamadas PInvoke)

/CLRSUPPORTLASTERROR, que está activado de forma predeterminada, conserva el último código de error de las funciones llamadas a través del mecanismo P/Invoke, que permite llamar a funciones nativas en DLLS, desde el código compilado con /clr.

Sintaxis

/CLRSUPPORTLASTERROR
/CLRSUPPORTLASTERROR:NO
/CLRSUPPORTLASTERROR:SYSTEMDLL

Comentarios

Conservar el último código de error implica una disminución del rendimiento. Si no desea incurrir en el costo de rendimiento de conservar el último código de error, vincule mediante /CLRSUPPORTLASTERROR:NO.

Puede minimizar la penalización de rendimiento mediante la vinculación con /CLRSUPPORTLASTERROR:SYSTEMDLL, que solo conserva el último código de error para las funciones de los archivos DLL del sistema.

Nota:

No se admite la conservación del último error para las funciones no administradas que consume el código CLR en el mismo módulo.

Para establecer esta opción del vinculador en el entorno de desarrollo de Visual Studio

  1. Abra el cuadro de diálogo Páginas de propiedades del proyecto. Para más información, vea Establecimiento de las propiedades del compilador y la compilación.

  2. Seleccione la página de propiedades Propiedades de configuración>Enlazador>Avanzado.

  3. Modifique la propiedad Preserve Last Error Code for PInvoke Calls (Conservar el último código de error para llamadas de PInvoke). Haga clic en Aceptar o en Aplicar para guardar los cambios.

Para establecer esta opción del vinculador mediante programación

Ejemplos

En el ejemplo siguiente se define un archivo DLL nativo con una función exportada que modifica el último error.

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

En el ejemplo siguiente se usa el archivo DLL, en el que se muestra cómo usar /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).

Consulte también

Referencia del enlazador MSVC
Opciones del enlazador MSVC