{
while(true)
{
DWORD res = MsgWaitForMultipleObjects(1,//количество ожидаемых объектов
&pi.hProcess,//указатель на массив «ожидаемых» дескрипторов
FALSE, //TRUE – ждать освобождения всех объектов + событие
//FALSE - когда любой из ожидаемых объектов освободился или событие
INFINITE,//интервал ожидания в мс
QS_ALLEVENTS);//тип события - QS_KEY | QS_MOUSE
//res – если значение лежит в диапазоне от WAIT_OBJECT_0 до (WAIT_OBJECT_0+количество ожидаемых объектов -1), то освободился один из ожидаемых объектов, если возвращаемое значение больше или равно (WAIT_OBJECT_0+количество ожидаемых объектов -1), то поступило сообщение.
if(res==WAIT_OBJECT_0)
break;// дождались (у нас всего один объект).
//Если false, то событие – обрабатываем его
MSG m;
while(PeekMessage(&m,0,0,0,PM_REMOVE))//пока в очереди есть сообщения – удаляем из очереди и обрабатываем, иначе (если сообщений нет) PeekMessage неизрасходованный квант «передаст» другому потоку
{
DispatchMessage(&m);//”обрабатываем» сообщение
}
}
// Закрывайте описатели, как только необходимость в них отпадает!!!
CloseHandle( pi.hProcess );
Для завершения процесса:
BOOL TerminateProcess ( HANDLE hProcess, // дескриптор завершаемого процесса UINT uExitCode); // код завершения процесса
Посредством формирования структуры STARTUPINFO управляйте «видом» запускаемого процесса. Помните, что некоторые поля имеют смысл только для консольных приложений, а некоторые только для GUI-приложений => соответственно два типа запускаемых приложений (Замечание: для того, чтобы пользоваться Win32 API в консольном приложении достаточно подключить <windows.h>) Замечание: помните, что некоторые поля являются «рекомендательными» => только если порождаемый процесс использует умолчания для соответствующих параметров CreateWindow (CW_USEDEFAULT) и ShowWindow (то значение, которое получает WinMain) для главного окна приложения, Вы увидите результат => из стандартных приложений лучше всего экспериментировать на солитере (можно при запуске минимизировать или максимизировать) или для того, чтобы опробовать любые возможности, используйте в качестве дочернего процесса свое приложение, в котором параметры заданы по умолчанию.
typedef struct _STARTUPINFO
{
DWORD cb; // размер структуры в байтах
LPTSTR lpReserved; // зарезервировано
LPTSTR lpDesktop; // рабочий стол и станция для процесса
LPTSTR lpTitle; // заголовок окна консольного процесса
DWORD dwX; // координата угла окна в пикселах
DWORD dwY; // координата угла окна в пикселах
DWORD dwXSize; // ширина окна в пикселах
DWORD dwYSize; // высота окна в пикселах
DWORD dwXCountChars; // ширина консольного окна
DWORD dwYCountChars; // высота консольного окна
DWORD dwFillAttribute; // атрибуты текста консольного окна
DWORD dwFlags; // какие поля структурыследует учитывать
WORD wShowWindow; // как отображать главное окно
WORD cbReserved2; // зарезервировано
LPBYTE lpReserved2; // зарезервировано
HANDLE hStdInput; // дескриптор потока ввода
HANDLE hStdOutput; // вывода
HANDLE hStdError; // сообщений об ошибках
} STARTUPINFO, *LPSTARTUPINFO;
Поле dwFlags содержит флаги, определяющие, содержимое каких полей структуры STARTUPINFO необходимо учитывать при запуске нового процесса:
Значение |
Используемые поля |
STARTF_USESHOWWINDOW Как должно выглядеть главное окно |
WShowWindow (значения параметра nCmdShow функции ShowWindow) |
STARTF_USEPOSITION Левый верхний угол |
dwX, dwY |
STARTF_USESIZE размеры |
dwXSize, dwYSize |
STARTF_USECOUNTCHARS Для консольных приложений – размер в символах |
dwXCountChars, dwYCountChars |
STARTF_USEFILLATTRIBUTE |
dwFillAttribute |
STARTF_USESTDHANDLES |
hStdInput, hStdOutput и hStdError |
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.