ShellExecuteEx& GetExitCodeProcess - 处理无效或分段错误

时间:2013-05-15 18:39:53

标签: c++ qt segmentation-fault shellexecuteex

我正在尝试启动一个应用程序,然后监视它直到它关闭。我正在使用ShellExecuteEX和GetExitCodeProcess并遇到一些问题。

以下代码在调用GetExitCodeProcess时导致分段错误。如果我更改shellInfo.fMask = NULL,它将不会出现错误但我收到错误说无效句柄。

Notepad.exe确实启动了。

QString executeFile("notepad.exe");

// Conversion QString to LPCTSTR
wchar_t* tempEF = new wchar_t[executeFile.size()+1];
int tempEFTerminator = executeFile.toWCharArray(tempEF);
tempEF[tempEFTerminator] = 0;


LPDWORD exitCode = 0;
SHELLEXECUTEINFO shellInfo;

shellInfo.cbSize = sizeof(SHELLEXECUTEINFO);

shellInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
shellInfo.hwnd = NULL;
shellInfo.lpVerb = NULL;

shellInfo.lpFile = tempEF;

shellInfo.lpParameters = NULL;
shellInfo.lpDirectory = NULL;
shellInfo.nShow = SW_MAXIMIZE;
shellInfo.hInstApp = NULL;

if(ShellExecuteEx(&shellInfo))
{
        if(!GetExitCodeProcess(shellInfo.hProcess, exitCode))
        {
            DWORD lastError = GetLastError();

            LPTSTR lpMsgBuf;

            FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS , NULL, lastError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL);
            QString errorText = ("failed with error: " + QString::number(lastError) + QString::fromWCharArray(lpMsgBuf));
        }
}

1 个答案:

答案 0 :(得分:3)

我认为,问题出在exitCode论证中。

MSND将其指定为LPDWORD指针DWORD。您应该将有效指针传递给该函数,因此可以取消引用它以保存退出代码:

DWORD exitCode;
//....
if(!GetExitCodeProcess(shellInfo.hProcess, &exitCode))