C++ WinAPI-GetLastError在通过COM ATL DLL调用时始终返回0
在我的Windows API包装ATL dll中,我向COM公开了C++ WinAPI-GetLastError在通过COM ATL DLL调用时始终返回0,c++,dll,vbscript,getlasterror,C++,Dll,Vbscript,Getlasterror,在我的Windows API包装ATL dll中,我向COM公开了GetLastError,用于Windows API错误处理 具体实施如下: STDMETHODIMP CWinAPI::WinAPI\u GetLastError(int*Result){ *结果=(int)GetLastError(); 返回S_OK; } 当我从VBScript使用它时,如: Dim WINAPI:Set WINAPI=WScript.CreateObject(“WinAPIWrapperLib.WINAP
GetLastError
,用于Windows API错误处理
具体实施如下:
STDMETHODIMP CWinAPI::WinAPI\u GetLastError(int*Result){
*结果=(int)GetLastError();
返回S_OK;
}
当我从VBScript使用它时,如:
Dim WINAPI:Set WINAPI=WScript.CreateObject(“WinAPIWrapperLib.WINAPI”)
WINAPI.WINAPI_ShellExecute NULL、“”不存在文件.exe、“”、“”、1
Echo CStr(WINAPI.WINAPI_GetLastError)
这必须生成ERROR\u FILE\u NOT\u FOUND
错误,但是当我通过VBScript从包装器dll调用此windows API函数时,它总是返回ERROR\u SUCCESS
但是,当我将以下行添加到WinAPI\u 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);
它正确生成错误错误文件\u未找到
我想知道GetLastError
出了什么问题
提前谢谢
调用线程执行的函数通过调用
SetLastError函数。您应该调用GetLastError函数
当函数的返回值指示这样的调用
将返回有用的数据。这是因为有些函数调用
成功时,SetLastError为零,清除错误代码
由最近失败的函数设置
问题是:您不能保证在ShellExecute
之后立即调用GetLastError
。这两个调用之间有很多事情在进行——COM封送、VBScript调用等,它们肯定会影响线程的最后一个错误标志。事实上,您不应该在VBScript中同时使用GetLastError
:
Visual Basic:应用程序应调用err.LastDllError而不是
GetLastError
调用线程执行的函数通过调用
SetLastError函数。您应该调用GetLastError函数
当函数的返回值指示这样的调用
将返回有用的数据。这是因为有些函数调用
成功时,SetLastError为零,清除错误代码
由最近失败的函数设置
问题是:您不能保证在ShellExecute
之后立即调用GetLastError
。这两个调用之间有很多事情在进行——COM封送、VBScript调用等,它们肯定会影响线程的最后一个错误标志。事实上,您不应该在VBScript中同时使用GetLastError
:
Visual Basic:应用程序应调用err.LastDllError而不是
GetLastError
谢谢,但是AutoIt也实现了这些功能。当我像上面那样使用AutoIt时,使用
Dllcall
调用WinAPI函数,然后通过一个单独的Dllcall
获取最后一个错误,它会正确返回最后一个错误。为什么呢?很可能它会在每次API方法调用后在内部缓存错误代码。谢谢,我也会这样做,并通知您发生了什么。谢谢,但AutoIt也实现了这些功能。当我像上面那样使用AutoIt时,使用Dllcall
调用WinAPI函数,然后通过一个单独的Dllcall
获取最后一个错误,它会正确地返回最后一个错误。为什么呢?很可能它会在每次API方法调用后在内部缓存错误代码。谢谢,我也会这样做,并通知您发生了什么。