2010-07-09 199 views

回答

0

ShellExecuteExSEE_MASK_NOCLOSEPROCESS將(除其他事項外)給你一個句柄新工藝。你可以在那個句柄上做一個WaitForSingleObject,當它結束時它將被髮信號通知。順便說一句,對於一個GUI程序來說,這幾乎總是一個壞主意 - 直到另一個程序退出爲止,使GUI不響應真的是一個糟糕的主意。

1

代碼:

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部分。

0

如果您只是想啓動一個進程,則不必使用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);