/CLRSUPPORTLASTERROR
(PInvoke 呼び出しの最後のエラー コードを保持する)
既定でオンになっている /CLRSUPPORTLASTERROR
を指定すると、P/Invoke メカニズムを介して呼び出される関数の最終エラー コードが保持されます。これにより、/clr
を指定してコンパイルしたコードから DLL のネイティブ関数を呼び出すことができます。
構文
/CLRSUPPORTLASTERROR
/CLRSUPPORTLASTERROR:NO
/CLRSUPPORTLASTERROR:SYSTEMDLL
解説
最終エラー コードを保持すると、パフォーマンスが低下します。 最後のエラー コードを保持するパフォーマンス コストを発生させたくない場合は、 /CLRSUPPORTLASTERROR:NO
を使用してリンクします。
システム DLL 内の関数の最後のエラー コードのみを保持する /CLRSUPPORTLASTERROR:SYSTEMDLL
にリンクすることで、パフォーマンスの低下を最小限に抑えることができます。
Note
同じモジュール内の CLR コードによって使用されるアンマネージ関数では、最後のエラーの保持はサポートされていません。
- 詳細については、「
/clr
(共通言語ランタイムのコンパイル)」を参照してください。
Visual Studio 開発環境でこのリンカー オプションを設定するには
プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳しくは、「コンパイラとビルドのプロパティを設定する」をご覧ください。
[構成プロパティ]>[リンカー]>[詳細] プロパティ ページを選択します。
PInvoke Calls の Preserve Last Error Code プロパティを変更します。 [OK] または [適用] を選択して、変更内容を保存します。
このリンカーをコードから設定するには
- 以下AdditionalOptionsを参照してください。
例
次の例では、最終エラーを変更する 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).