I'm trying to start an application and then monitor it until it closes. I'm using ShellExecuteEX and GetExitCodeProcess and having several problems.

The code below causes a segmentation fault when GetExitCodeProcess is Called. If I change shellInfo.fMask = NULL, it will not seg fault but I recieve an error saying Invalid Handle.

Notepad.exe does launch.

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));
        }
}
有帮助吗?

解决方案

I think, the problem is in exitCode argument.

MSND specifies it as LPDWORD that is pointer for DWORD. You should pass valid pointer to the function, so it could dereference it to save exit code here:

DWORD exitCode;
//....
if(!GetExitCodeProcess(shellInfo.hProcess, &exitCode))
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top