Programming: Delphi


Иллюстрированный самоучитель по 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;




Назад | Оглавление | Вперёд




При перепечатке любого материала с сайта, видимая ссылка на источник www.warayg.narod.ru и все имена, ссылки авторов обязательны.

© 2005
 

Hosted by uCoz