Иллюстрированный самоучитель по Delphi 7 для профессионалов

Процесс. Порождение дочернего процесса.

Объект типа процесс (process) может быть использован для того, чтобы приостановить выполнение потока в том случае, если он для своего продолжения нуждается в завершении процесса. С практической точки зрения такая проблема встает, когда нужно в рамках вашего приложения исполнить приложение, созданное кем-то другим, или, к примеру, сеанс MS-DOS.

Рассмотрим, как, собственно, один процесс может породить другой. Вместо устаревшей и поддерживаемой только для совместимости функции winExec, перекочевавшей из прежних версий Windows, гораздо правильнее использовать более мощную:

function CreateProcess(IpApplicationName: PChar; IpCorranandLine: PChar;
IpProcessAttributes, IpThreadAttributes: PSecurityAttributes;
blnheritHandles: BOOL;
dwCreationFlags: DWORD; IpEnvironment: Pointer;
IpCurrentDirectory: PChar;
const IpStartupInfo: TStartupInfo;
var IpProcessInformation: TProcessInformation): BOOL;

Первые два параметра ясны – это имя запускаемого приложения и передаваемые ему в командной строке параметры. Параметр dwCreationFlags содержит флаги, определяющие способ создания нового процесса и его будущий приоритет. Использованные в приведенном ниже листинге флаги означают: CREATE_NEW_CONSOLE – будет запущено новое консольное приложение с отдельным окном; NORMAL_PRIORITY_CLASS – нормальный приоритет.

Структура TStartupInfo содержит сведения о размере, цвете, положении окна создаваемого приложения. В нижеследующем примере (листинг 29.1) используется поле wshowwindow: установлен флаг SW_SHOWNORMAL, означающий визуализацию окна с нормальным размером.

На выходе функции заполняется структура IpProcessInformation. В ней программисту возвращаются дескрипторы и идентификаторы созданного процесса и его первичного потока. Нам понадобится дескриптор процесса – в нашем примере создается консольное приложение, затем происходит ожидание его завершения. "Просигналит" нам об этом именно объект IpProcessInformation.hProcess.

Листинг 29.1. Порождение дочернего процесса.

var
IpStartupInfo: TStartupInfo;
IpProcessInformation: TProcessInformation;
begin
FillChar(IpStartupInfo,Sizeof(IpStartupInfo),10);
IpStartupInfo.cb: = Sizeof(IpStartupInfo};
IpStartupInfo.dwFlags: = STARTFJJSESHOWWINDOW;
IpStartupInfo.wShowWindow: = SW_SHOWNORMAL;
if not CreateProcess(nil,
PChar('ping localhost'),
nil,
nil,
false,
CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
nil,
nil,
IpStartupInfo, IpProcessInformation) then
ShowMessage(SysErrorMessage(GetLastError;)
else
begin
WaitForSingleObject
(IpProcessInformation.hProcess, 10000);
CloseHandle(IpProcessInformation.hProcess);
end;
end;
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.