Поделиться через


/CLRSUPPORTLASTERROR (Сохранение последнего кода ошибки для вызовов PInvoke)

/CLRSUPPORTLASTERROR, который по умолчанию включен, сохраняет последний код ошибки функций, вызываемых с помощью механизма P/Invoke, который позволяет вызывать собственные функции в DLLS из кода, скомпилированного с /clrпомощью.

Синтаксис

/CLRSUPPORTLASTERROR
/CLRSUPPORTLASTERROR:NO
/CLRSUPPORTLASTERROR:SYSTEMDLL

Замечания

Сохранение последнего кода ошибки подразумевает снижение производительности. Если вы не хотите нести затраты на производительность сохранения последнего кода ошибки, обратитесь по /CLRSUPPORTLASTERROR:NOссылке.

Вы можете свести к минимуму штраф производительности, связав с /CLRSUPPORTLASTERROR:SYSTEMDLLним только последний код ошибки для функций в системных БИБЛИОТЕКАх DLL.

Примечание.

Сохранение последней ошибки не поддерживается для неуправляемых функций, используемых кодом СРЕДЫ CLR в том же модуле.

Задание данного параметра компоновщика в среде разработки Visual Studio

  1. Откройте диалоговое окно Страницы свойств проекта. Дополнительные сведения см. в разделе Set компилятора и свойств сборки.

  2. Выберите страницу свойств>компоновщика>конфигурации Advanced.

  3. Измените свойство "Сохранить последний код ошибки" для вызова PInvoke. Нажмите кнопку "ОК" или "Применить", чтобы сохранить изменения.

Задание данного параметра компоновщика программным способом

Примеры

В следующем примере определяется собственная библиотека 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).

См. также

Справочник по компоновщику MSVC
Параметры компоновщика MSVC