/CLRSUPPORTLASTERROR
(Сохранение последнего кода ошибки для вызовов PInvoke)
/CLRSUPPORTLASTERROR
, который по умолчанию включен, сохраняет последний код ошибки функций, вызываемых с помощью механизма P/Invoke, который позволяет вызывать собственные функции в DLLS из кода, скомпилированного с /clr
помощью.
Синтаксис
/CLRSUPPORTLASTERROR
/CLRSUPPORTLASTERROR:NO
/CLRSUPPORTLASTERROR:SYSTEMDLL
Замечания
Сохранение последнего кода ошибки подразумевает снижение производительности. Если вы не хотите нести затраты на производительность сохранения последнего кода ошибки, обратитесь по /CLRSUPPORTLASTERROR:NO
ссылке.
Вы можете свести к минимуму штраф производительности, связав с /CLRSUPPORTLASTERROR:SYSTEMDLL
ним только последний код ошибки для функций в системных БИБЛИОТЕКАх DLL.
Примечание.
Сохранение последней ошибки не поддерживается для неуправляемых функций, используемых кодом СРЕДЫ CLR в том же модуле.
- Дополнительные сведения см. в разделе
/clr
(Компиляция среды CLR).
Задание данного параметра компоновщика в среде разработки Visual Studio
Откройте диалоговое окно Страницы свойств проекта. Дополнительные сведения см. в разделе Set компилятора и свойств сборки.
Выберите страницу свойств>компоновщика>конфигурации Advanced.
Измените свойство "Сохранить последний код ошибки" для вызова PInvoke. Нажмите кнопку "ОК" или "Применить", чтобы сохранить изменения.
Задание данного параметра компоновщика программным способом
- См. раздел AdditionalOptions.
Примеры
В следующем примере определяется собственная библиотека DLL с одной экспортируемой функцией, которая изменяет последнюю ошибку.
// 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));
}
В следующем примере используется библиотека DLL, демонстрирующая использование /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).