Запуск внешнего приложения и блокировка текущего приложения до выхода запущенного приложения - PullRequest
1 голос
/ 09 июля 2010

Я не уверен, есть ли способ

Запустите внешнее приложение и заблокируйте текущее приложение, пока запущенное приложение не закроется. В настоящее время я использую следующий неблокирующий метод (MFC) для запуска

std::string str = "Notepad2.exe";
// Non-blocking. Return immediately.
WinExec(str.c_str(), SW_SHOW);

Ответы [ 3 ]

1 голос
/ 09 июля 2010

код:

SHELLEXECUTEINFO sei = {0};

sei.cbSize = sizeof (SHELLEXECUTEINFO);
sei.fMask  = SEE_MASK_NOCLOSEPROCESS;
sei.lpVerb = "open";
sei.lpFile = "notepad.exe";
sei.nShow  = SW_SHOWNORMAL;

if (ShellExecuteEx (&sei))
{
   WaitForSingleObject (sei.hProcess, INFINITE);
}

Как отмечает Джерри, это плохо для вашего собственного графического интерфейса. Но если процесс, который вы запускаете, прямо или косвенно, выполняет широковещательную передачу SendMessage, то это может привести к катастрофической тупиковой ситуации, поскольку у вашего процесса есть окно, но он не перекачивает никаких сообщений: запущенный процесс ждет, пока ваш код обработает его сообщение, ты ждешь этого Clang ...

Вместо этого можно использовать MsgWaitForMultipleObjects или, что еще лучше, разделить запуск и ожидание на поток и просто отключить любую часть вашего пользовательского интерфейса, с которой пользователь не хочет взаимодействовать.

0 голосов
/ 09 июля 2010

Если вы просто хотите запустить процесс, вам не нужно использовать ShellExecuteEx, вместо этого используйте CreateProcess. Вот непроверенный пример:

std::wstring commandLine = L"Notepad2.exe"
std::wstring::size_type length = commandLine.size();
boost::scoped_array<WCHAR> buffer(new WCHAR[length + 1]);
std::copy(commandLine.begin(), commandLine.end(), buffer.get());
buffer[length] = L'\0';
STARTUPINFO startupInfo;
ZeroMemory(&startupInfo, sizeof startupInfo);
startupInfo.cb = sizeof startupInfo;
PROCESS_INFORMATION processInfo;
CreateProcess(NULL, buffer.get(), NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfo);
CloseHandle(processInfo.hThread);
WaitForSingleObject(processInfo.hProcess, INFINITE);
CloseHandle(processInfo.hProcess);
0 голосов
/ 09 июля 2010

ShellExecuteEx с SEE_MASK_NOCLOSEPROCESS (среди прочего) даст вам подсказку для нового процесса.Вы можете сделать WaitForSingleObject для этого дескриптора, который будет сигнализирован, когда он завершится.Кстати, для программы с графическим интерфейсом это почти всегда плохая идея - сделать ваш графический интерфейс безреагирующим до выхода из другой программы - плохая идея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...