/CLRSUPPORTLASTERROR (Preserve Last Error Code for PInvoke Calls)
The latest version of this topic can be found at -CLRSUPPORTLASTERROR (Preserve Last Error Code for PInvoke Calls).
CLRSUPPORTLASTERROR**, which is on by default, preserves the last error code of functions called through the P/Invoke mechanism, which allows you to call native functions in DLLS, from code compiled with /clr.
Syntax
/CLRSUPPORTLASTERROR{:NO | SYSTEMDLL}
Remarks
Preserving the last error code implies a decrease in performance. If you do not want to incur the performance impact of preserving the last error code, link with /CLRSUPPORTLASTERROR:NO.
You can minimize the performance impact by linking with /CLRSUPPORTLASTERROR:SYSTEMDLL, which only preserves the last error code for functions in system DLLs. A system DLL is defined as one of the following:
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 |
Note
Preserving the last error is not supported for unmanaged functions that are consumed by CLR code, in the same module.
- For more information, see /clr (Common Language Runtime Compilation).
To set this linker option in the Visual Studio development environment
Open the project's Property Pages dialog box. For details, see Setting Visual C++ Project Properties.
Click the Linker folder.
Click the Command Line property page.
Type the option into the Additional Options box.
To set this linker option programmatically
- See AdditionalOptions.
Example
The following sample defines a native DLL with one exported function that modifies last 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));
}
Example
The following sample consumes the DLL, demonstrating how to use /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).