/CLRSUPPORTLASTERROR (Conservar el último código de error para las llamadas a PInvoke)
/CLRSUPPORTLASTERROR, que está activado de forma predeterminada, preserva el último código de error de funciones llamadas a través del mecanismo P/Invoke, que le permite llamar a funciones nativas en archivos DLL, a partir de código compilado con /clr.
/CLRSUPPORTLASTERROR{:NO | SYSTEMDLL}
Comentarios
Conservar el último código de error implica una disminución del rendimiento.Si no desea influir en el rendimiento por conservar el último código de error, establezca un vínculo con /CLRSUPPORTLASTERROR:NO.
Puede minimizar el impacto en el rendimiento estableciendo un vínculo con /CLRSUPPORTLASTERROR:SYSTEMDLL, que sólo conserva el último código de error para las funciones de archivos DLL del sistema.Un archivo DLL del sistema se define como uno de los siguientes:
ACLUI.DLL |
ACTIVEDS.DLL |
ADPTIF.DLL |
ADVAPI32.DLL |
ASYCFILT.DLL |
AUTHZ.DLL |
AVICAP32.DLL |
AVIFIL32.DLL |
CABINET.DLL |
CLUSAPI.DLL |
COMCTL32.DLL |
COMDLG32.DLL |
COMSVCS.DLL |
CREDUI.DLL |
CRYPT32.DLL |
CRYPTNET.DLL |
CRYPTUI.DLL |
D3D8THK.DLL |
DBGENG.DLL |
DBGHELP.DLL |
DCIMAN32.DLL |
DNSAPI.DLL |
DSPROP.DLL |
DSUIEXT.DLL |
GDI32.DLL |
GLU32.DLL |
HLINK.DLL |
ICM32.DLL |
IMAGEHLP.DLL |
IMM32.DLL |
IPHLPAPI.DLL |
IPROP.DLL |
KERNEL32.DLL |
KSUSER.DLL |
LOADPERF.DLL |
LZ32.DLL |
MAPI32.DLL |
MGMTAPI.DLL |
MOBSYNC.DLL |
MPR.DLL |
MPRAPI.DLL |
MQRT.DLL |
MSACM32.DLL |
MSCMS.DLL |
MSI.DLL |
MSIMG32.DLL |
MSRATING.DLL |
MSTASK.DLL |
MSVFW32.DLL |
MSWSOCK.DLL |
MTXEX.DLL |
NDDEAPI.DLL |
NETAPI32.DLL |
NPPTOOLS.DLL |
NTDSAPI.DLL |
NTDSBCLI.DLL |
NTMSAPI.DLL |
ODBC32.DLL |
ODBCBCP.DLL |
OLE32.DLL |
OLEACC.DLL |
OLEAUT32.DLL |
OLEDLG.DLL |
OPENGL32.DLL |
PDH.DLL |
POWRPROF.DLL |
QOSNAME.DLL |
QUERY.DLL |
RASAPI32.DLL |
RASDLG.DLL |
RASSAPI.DLL |
RESUTILS.DLL |
RICHED20.DLL |
RPCNS4.DLL |
RPCRT4.DLL |
RTM.DLL |
RTUTILS.DLL |
SCARDDLG.DLL |
SECUR32.DLL |
SENSAPI.DLL |
SETUPAPI.DLL |
SFC.DLL |
SHELL32.DLL |
SHFOLDER.DLL |
SHLWAPI.DLL |
SISBKUP.DLL |
SNMPAPI.DLL |
SRCLIENT.DLL |
STI.DLL |
TAPI32.DLL |
TRAFFIC.DLL |
URL.DLL |
URLMON.DLL |
USER32.DLL |
USERENV.DLL |
USP10.DLL |
UXTHEME.DLL |
VDMDBG.DLL |
VERSION.DLL |
WINFAX.DLL |
WINHTTP.DLL |
WININET.DLL |
WINMM.DLL |
WINSCARD.DLL |
WINTRUST.DLL |
WLDAP32.DLL |
WOW32.DLL |
WS2_32.DLL |
WSNMP32.DLL |
WSOCK32.DLL |
WTSAPI32.DLL |
XOLEHLP.DLL |
[!NOTA]
Para las funciones no administradas que se utilizan en el código de CLR, en el mismo módulo, no se puede conservar el último error.
- Para obtener más información, vea /clr (Compilación de 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 obtener más información, vea Establecer las propiedades de un proyecto de Visual C++
Haga clic en la carpeta Vinculador.
Haga clic en la página de propiedades Línea de comandos.
Escriba la opción en el cuadro Opciones adicionales.
Para establecer esta opción del vinculador mediante programación
- Vea AdditionalOptions.
Ejemplo
El ejemplo siguiente 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));
}
El ejemplo siguiente utiliza el archivo DLL, para mostrar cómo se utiliza /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);
}