我不知道是否有一種方法可以啓動外部應用程序和模塊當前應用程序,直至啓動的應用程序退出
啓動外部應用程序,並阻止當前的應用程序,直至啓動的應用程序已經退出。
目前,我使用下面的無阻塞方法(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);