我不知道是否有一种方法可以启动外部应用程序和模块当前应用程序,直至启动的应用程序退出
启动外部应用程序,并阻止当前的应用程序,直至启动的应用程序已经退出。
目前,我使用下面的无阻塞方法(MFC)推出
std::string str = "Notepad2.exe";
// Non-blocking. Return immediately.
WinExec(str.c_str(), SW_SHOW);
我不知道是否有一种方法可以启动外部应用程序和模块当前应用程序,直至启动的应用程序退出
启动外部应用程序,并阻止当前的应用程序,直至启动的应用程序已经退出。
目前,我使用下面的无阻塞方法(MFC)推出
std::string str = "Notepad2.exe";
// Non-blocking. Return immediately.
WinExec(str.c_str(), SW_SHOW);
ShellExecuteEx
与SEE_MASK_NOCLOSEPROCESS
将(除其他事项外)给你一个句柄新工艺。你可以在那个句柄上做一个WaitForSingleObject
,当它结束时它将被发信号通知。顺便说一句,对于一个GUI程序来说,这几乎总是一个坏主意 - 直到另一个程序退出为止,使GUI不响应真的是一个糟糕的主意。
代码:
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);
}
随着杰里指出,这是不利于你自己的GUI。但是,如果直接或间接启动的进程执行SendMessage广播,那么这会导致灾难性的死锁,因为您的进程有一个窗口,但不会抽出任何消息:启动的进程正在等待您的代码处理其消息,并且你在等待它。 Clang ...
您可以使用MsgWaitForMultipleObjects代替,或者更好的是,将启动和等待分隔成一个线程,并简单地禁用您不希望用户与之交互的任何UI部分。
如果您只是想启动一个进程,则不必使用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);