ShellExecuteEx & amp; GetExitCodeProcess — обрабатывать недопустимые ошибки или ошибки сегментации

Я пытаюсь запустить приложение, а затем отслеживать его, пока оно не закроется. Я использую ShellExecuteEX и GetExitCodeProcess и имею несколько проблем.

Приведенный ниже код вызывает ошибку сегментации, когда вызывается GetExitCodeProcess. Если я изменю shellInfo.fMask = NULL, это не вызовет ошибку, но я получу сообщение об ошибке Invalid Handle.

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

Решение

Я думаю, проблема в exitCode аргумент.

MSND определяет это как LPDWORD это указатель для DWORD, Вы должны передать действительный указатель на функцию, чтобы она могла разыменовать его, чтобы сохранить код завершения здесь:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]