[英]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.