WinAPI - GetLastError 在通过 COM ATL DLL 调用时始终返回 0
WinAPI - GetLastError always returns 0 when called via a COM ATL DLL
在我的Windows API包装器ATL dll中,我已经向COM公开了GetLastError
以进行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
如下所示:
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 成功时为零,擦除错误代码 由最近失败的函数设置。
问题是:您无法保证GetLastError
在ShellExecute
之后立即调用。该调用之间发生了很多事情 - COM 封送、VBScript 调用等,这肯定会影响线程最后一个错误标志。事实上,你不应该在 VBScript 中使用GetLastError
:
Visual Basic:应用程序应该调用 err。上一个Dll错误而不是 获取最后错误。
相关文章:
- 如何安全地从 DLL 调用返回对象
- 类对象属性是否可以调用返回属性应具有的值的方法C++?
- 从类似构造函数的调用返回模板化智能指针
- C ++ DLL导入:函数调用返回错误的结果
- 如何调用返回类方法指针的类方法
- 如何调用返回双精度或字符串并将其保存在地图上但作为对象的类的方法
- FindResource 调用返回 RCDATA 类型的文本文件的 NULL
- 如何调用返回指针数组的函数?C++
- Perl xs - 无法从方法调用返回新的自定义 C++ 对象 - 改为返回标量值
- BOOST ::线程内会成员功能调用返回unique_lock Instantiation错误
- 断言调用返回的函数的签名 &(引用)
- 对于相同的输入参数,多个函数调用返回不同的结果
- 如何调用返回后删除[]内存
- 使用二维数组调用返回结构
- C++:声明、定义和调用返回模板类对象的函数
- 调用返回数组的函数
- c++方法从c#dllimport调用返回0
- 方法调用返回空值
- 我希望计时器只在上一个调用返回或完成执行时调用代码
- 任何时间函数保证为调用返回不同的值