我经常从本机C ++ / Win32应用程序调用ShellExecute来执行最终用户从GUI选择的任何shell项目。项目是可执行文件/脚本或链接(.lnk)。在某些对我来说模糊不清的情况下,以下函数有时会返回8
(SE_ERR_OOM
错误;只有非常简短的文档记录)。结果,该项目未被执行。什么可能导致这个错误?
int doExecute(LPCTSTR file, LPCTSTR args, LPCTSTR workDir)
{
assert(file && *file);
HRESULT hRes = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
assert(hRes == S_OK || hRes == S_FALSE);
int code = (int)ShellExecute(NULL, NULL, file, args, workDir, SW_SHOWNORMAL);
doLog("ShellExecute returned: %d, %u", code, GetLastError()); // EDIT
CoUninitialize();
return code;
}
背景信息:
CoInitializeEx
的标志是在MSDN推荐之后盲目选择的(参见ShellExecute文档),而不是因为个人选择到目前为止对该错误的观察:
ShellExecute
后立即致电GetLastError,始终返回0
.lnk
文件时发生,但并不总是同一个文件Process Explorer
(sysinternals.com)并未显示任何内存使用高峰doExecute
。所有过程都是在没有错误的情况下产生的。答案 0 :(得分:1)
经过长时间的测试后,根据@DavidHeffernan和@RossRidge的建议,在我对代码进行了一些更改之后,错误再也没有发生了。虽然我不能真正认为这是一个明确的答案本身,因为我仍然不知道究竟发生了什么,我到目前为止还没有能够重现这个错误。
应用修改:
ShellExecute
替换ShellExecuteEx
来电。CoInitializeEx
一次,而不是CoUninitialize
个反对。但保留了以下嵌套CoInitializeEx
- CoUninitialize
对。编辑:如果有人需要,只是为了确认问题不再发生,即使经过几个月的测试,也应用了这些修改。