/CLRSUPPORTLASTERROR (保留 PInvoke 调用) 的最后错误代码

/CLRSUPPORTLASTERROR(默认处于打开状态)保留通过 P/Invoke 机制调用的函数的最后一个错误代码,该机制允许从使用编译的代码 /clr调用 DLLS 中的本机函数。

语法

/CLRSUPPORTLASTERROR
/CLRSUPPORTLASTERROR:NO
/CLRSUPPORTLASTERROR:SYSTEMDLL

备注

保留上次的错误代码意味着性能下降。 如果不想产生保留最后一个错误代码的性能成本,请使用 /CLRSUPPORTLASTERROR:NO链接。

可以通过链接来 /CLRSUPPORTLASTERROR:SYSTEMDLL最大程度地降低性能损失,该链接仅保留系统 DLL 中函数的最后一个错误代码。

注意

同一模块中 CLR 代码使用的非托管函数不支持保留最后一个错误。

在 Visual Studio 开发环境中设置此链接器选项

  1. 打开项目的“属性页” 对话框。 有关详细信息,请参阅设置编译器和生成属性

  2. 选择“配置属性”>“链接器”>“高级”属性页。

  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 链接器选项