在我的Windows API封裝器ATL DLL中,我公開了用於Windows API錯誤處理的COM組件GetLastError
。WinAPI - GetLastError在通過COM ATL DLL調用時總是返回0
據如下實施:
STDMETHODIMP CWinAPI::WinAPI_GetLastError(int *Result) {
*Result = (int)GetLastError();
return S_OK;
}
當我使用它從VBScript,如:
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
錯誤,但是當我打電話從這個Windows API函數我封裝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