繁体   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