/CLRSUPPORTLASTERROR (PInvoke 呼び出しの最終エラー コードの保持)
/CLRSUPPORTLASTERROR は既定で有効になっており、P/Invoke 機構を通じて呼び出された関数の最終エラー コードを保持します。P/Invoke は、/clr を指定してコンパイルしたコードから DLL 内のネイティブ関数を呼び出すことができる機能です。
/CLRSUPPORTLASTERROR{:NO | SYSTEMDLL}
解説
最終エラー コードを保持すると、パフォーマンスの低下につながります。パフォーマンスが最終エラー コードの保持による影響を受けないようにするには、/CLRSUPPORTLASTERROR:NO でリンクします。
/CLRSUPPORTLASTERROR:SYSTEMDLL でリンクすると、パフォーマンスの影響を最小にできますが、保持されるのはシステム DLL の関数の最終エラー コードだけになります。システム DLL は次のいずれかとして定義されています。
ACLUI.DLL |
ACTIVEDS.DLL |
ADPTIF.DLL |
ADVAPI32.DLL |
ASYCFILT.DLL |
AUTHZ.DLL |
AVICAP32.DLL |
AVIFIL32.DLL |
CABINET.DLL |
CLUSAPI.DLL |
COMCTL32.DLL |
COMDLG32.DLL |
COMSVCS.DLL |
CREDUI.DLL |
CRYPT32.DLL |
CRYPTNET.DLL |
CRYPTUI.DLL |
D3D8THK.DLL |
DBGENG.DLL |
DBGHELP.DLL |
DCIMAN32.DLL |
DNSAPI.DLL |
DSPROP.DLL |
DSUIEXT.DLL |
GDI32.DLL |
GLU32.DLL |
HLINK.DLL |
ICM32.DLL |
IMAGEHLP.DLL |
IMM32.DLL |
IPHLPAPI.DLL |
IPROP.DLL |
KERNEL32.DLL |
KSUSER.DLL |
LOADPERF.DLL |
LZ32.DLL |
MAPI32.DLL |
MGMTAPI.DLL |
MOBSYNC.DLL |
MPR.DLL |
MPRAPI.DLL |
MQRT.DLL |
MSACM32.DLL |
MSCMS.DLL |
MSI.DLL |
MSIMG32.DLL |
MSRATING.DLL |
MSTASK.DLL |
MSVFW32.DLL |
MSWSOCK.DLL |
MTXEX.DLL |
NDDEAPI.DLL |
NETAPI32.DLL |
NPPTOOLS.DLL |
NTDSAPI.DLL |
NTDSBCLI.DLL |
NTMSAPI.DLL |
ODBC32.DLL |
ODBCBCP.DLL |
OLE32.DLL |
OLEACC.DLL |
OLEAUT32.DLL |
OLEDLG.DLL |
OPENGL32.DLL |
PDH.DLL |
POWRPROF.DLL |
QOSNAME.DLL |
QUERY.DLL |
RASAPI32.DLL |
RASDLG.DLL |
RASSAPI.DLL |
RESUTILS.DLL |
RICHED20.DLL |
RPCNS4.DLL |
RPCRT4.DLL |
RTM.DLL |
RTUTILS.DLL |
SCARDDLG.DLL |
SECUR32.DLL |
SENSAPI.DLL |
SETUPAPI.DLL |
SFC.DLL |
SHELL32.DLL |
SHFOLDER.DLL |
SHLWAPI.DLL |
SISBKUP.DLL |
SNMPAPI.DLL |
SRCLIENT.DLL |
STI.DLL |
TAPI32.DLL |
TRAFFIC.DLL |
URL.DLL |
URLMON.DLL |
USER32.DLL |
USERENV.DLL |
USP10.DLL |
UXTHEME.DLL |
VDMDBG.DLL |
VERSION.DLL |
WINFAX.DLL |
WINHTTP.DLL |
WININET.DLL |
WINMM.DLL |
WINSCARD.DLL |
WINTRUST.DLL |
WLDAP32.DLL |
WOW32.DLL |
WS2_32.DLL |
WSNMP32.DLL |
WSOCK32.DLL |
WTSAPI32.DLL |
XOLEHLP.DLL |
注意
最終エラーの保持は、同じモジュールにある、CLR コードによって処理されるアンマネージ関数ではサポートされていません。
- 詳細については、「/clr (共通言語ランタイムのコンパイル)」を参照してください。
Visual Studio 開発環境でこのリンカー オプションを設定するには
プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳細については、「Visual C++ プロジェクトのプロパティの設定」を参照してください。
[リンカー] フォルダーをクリックします。
[コマンド ライン] プロパティ ページをクリックします。
[追加のオプション] ボックスにオプションを入力します。
このリンカーをコードから設定するには
- 「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);
}