Вопрос

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