|
Процесс. Порождение дочернего процесса
Объект типа процесс (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;
|