Запуск дочерних процессов. Простейшие способы взаимодействия (обмена данными), страница 2

{

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); // код завершения процесса

1.3. Управление видом запускаемого процесса

Посредством формирования структуры 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