Windows APIラッパーATL dllでは、Windows APIエラー処理のCOMにGetLastError
が公開されています。WinAPI - GetLastErrorは、COM ATL DLL経由で呼び出されたときに常に0を返します。
以下のように実装されます。私は私からこのWindows API関数を呼び出すとき
Dim WINAPI: Set WINAPI = WScript.CreateObject("WinAPIWrapperLib.WINAPI")
WINAPI.WinAPI_ShellExecute NULL, "", "NonExistentFile.exe", "", "", 1
WScript.Echo CStr(WINAPI.WinAPI_GetLastError)
これはERROR_FILE_NOT_FOUND
エラーを生成する必要がありますが、私は次のようにVBScriptのからそれを使用する場合
STDMETHODIMP CWinAPI::WinAPI_GetLastError(int *Result) {
*Result = (int)GetLastError();
return S_OK;
}
ラッパーDLLはVBScript経由で、常にERROR_SUCCESS
を返します。
しかし、私はこのようなWinAPI_ShellExecute
のための私の実装に次の行を追加する場合:
DWORD ErrorMessageID = ::GetLastError();
wchar_t ErrorID[1024];
swprintf_s(ErrorID, 1024, L"%d", ErrorMessageID);
MessageBox(nullptr, (LPCWSTR)&ErrorID, L"GetLastError", MB_OK | MB_ICONERROR | MB_DEFBUTTON1);
それは正しくエラーERROR_FILE_NOT_FOUND
を生成します。
私はGetLastError
が間違っていることを知りたいです。
ありがとうございました。呼び出し元のスレッドで実行される
ありがとうございますが、AutoItにはこれらの機能も実装されています。上記のようなAutoItを使用し、 'Dllcall'を使用してWinAPI関数を呼び出し、別の' Dllcall'で最後のエラーを取得すると、最後のエラーが正しく返されます。なぜですか? – GTAVLover
ほとんどの場合、各APIメソッド呼び出し後に内部的にエラーコードがキャッシュされます。 – Ari0nhh
ありがとう、私も同じことを行い、何が起こるかを通知します。 – GTAVLover