2010-07-09 218 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);