/CLRSUPPORTLASTERROR (PInvoke 呼び出しの最後のエラー コードを保持する)

/CLRSUPPORTLASTERRORは、既定でオンになっているため、P/Invoke メカニズムを使用して呼び出された関数の最後のエラー コードが保持されます。これにより、DLLS でネイティブ関数をコンパイルした /clrコードから呼び出すことができます。

構文

/CLRSUPPORTLASTERROR
/CLRSUPPORTLASTERROR:NO
/CLRSUPPORTLASTERROR:SYSTEMDLL

解説

最終エラー コードを保持すると、パフォーマンスが低下します。 最後のエラー コードを保持するパフォーマンス コストを発生させたくない場合は、次を使用 /CLRSUPPORTLASTERROR:NOしてリンクします。

システム DLL 内の関数の最後のエラー コードのみを保持するリンク /CLRSUPPORTLASTERROR:SYSTEMDLLを使用して、パフォーマンスの低下を最小限に抑えることができます。

Note

同じモジュール内の CLR コードによって使用されるアンマネージ関数では、最後のエラーの保持はサポートされていません。

Visual Studio 開発環境でこのリンカー オプションを設定するには

  1. プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳しくは、「コンパイラとビルドのプロパティを設定する」をご覧ください。

  2. [構成プロパティ]>[リンカー]>[詳細] プロパティ ページを選択します。

  3. [PInvoke Calls の 最後のエラー コードを保持する] プロパティを変更します。 [OK] または [適用] を選択して、変更内容を保存します。

このリンカーをコードから設定するには

次の例では、最終エラーを変更する 1 つのエクスポートされた関数を含むネイティブ 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 リンカー オプション