/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 obtener más información, consulte
/clr
(compilación con Common Language Runtime).
Para establecer esta opción del vinculador en el entorno de desarrollo de Visual Studio
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.
Seleccione la página de propiedades Propiedades de configuración>Enlazador>Avanzado.
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
- Vea AdditionalOptions.
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).