簡體   English   中英

WinAPI-通過COM ATL DLL調用時,GetLastError始終返回0

[英]WinAPI - GetLastError always returns 0 when called via a COM ATL DLL

在我的Windows API包裝器ATL dll中,我已將GetLastError暴露給COM以進行Windows API錯誤處理。

它的實現如下:

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錯誤,但是當我通過VBScript從包裝器dll調用此Windows API函數時,它總是返回ERROR_SUCCESS

但是,當我在WinAPI_ShellExecute實現中添加以下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什么問題。

提前致謝。

備注

調用線程執行的函數通過調用SetLastError函數來設置此值。 當函數的返回值指示此類調用將返回有用的數據時,應立即調用GetLastError函數。 這是因為某些函數在成功執行時會使用零調用SetLastError,從而清除最近失敗的函數設置的錯誤代碼。

問題是:您不能保證在ShellExecute之后立即調用GetLastError 在這些調用之間發生了很多事情-COM編組,VBScript調用等,這些操作肯定會影響線程最后錯誤標志。 實際上,您不應完全在VBScript中使用GetLastError

Visual Basic:應用程序應調用err.LastDllError而不是GetLastError。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM