Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ WinAPI-GetLastError在通过COM ATL DLL调用时始终返回0_C++_Dll_Vbscript_Getlasterror - Fatal编程技术网

C++ WinAPI-GetLastError在通过COM ATL DLL调用时始终返回0

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

在我的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.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方法调用后在内部缓存错误代码。谢谢,我也会这样做,并通知您发生了什么。