Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.26;
Скачать: CL | DM;

Вниз

Запуск внешнего приложения через CreateProcess   Найти похожие ветки 

 
Maxuz   (2004-11-15 17:20) [0]

Братва! Есть проблема! Нижеприведенная конструкция работает только почему-то в WindowsXP (другие системы и не нужны) НО только с SP2. Если запускать в винде без сервис пака или с первым сервис паком, то получаем ошибку при инициализации приложения reg.exe :( Как бороться?

  FillChar(Si, SizeOf(Si), 0);
  WITH Si DO
     BEGIN
        cb := SizeOf(Si);
        dwFlags := startf_UseShowWindow;
        wShowWindow := 0;
     END;
  Createprocess(nil, "reg EXPORT HKCU\Software\1C c:\10\1.reg", NIL, NIL,
     false, Create_default_error_mode, NIL, NIL, si, p);
  Waitforsingleobject(p.hProcess, infinite);
  ShowMessage("OK!");


 
Piter ©   (2004-11-15 18:39) [1]

Вопрос: как запустить другую программу и дождаться ее окончания.

Ответ: для запуска внешнего процесса будем использовать богатую на возможности функцию CreateProcess.
При успешном создании нового процесса эта функция заполняет передаваемую структуру PROCESS_INFORMATION, в частности поле hProcess, которое является указателем на новый процесс.
В случае надобности мы передаем полученный указатель на новый процесс в функцию WaitForSingleObject вместе со значением infinite.
В результате, WaitForSingleObject прервет выполнение потока нашей программы до тех пор, пока нужный нам процесс не завершится. В случае со значением infinite функция будет ждать бесконечно долго, поэтому вы должны быть уверены, что нужный процесс когда-нибудь завершится, иначе ваш поток никогда не получит управление обратно (в случае, если данный код исполняется для основного потока как в примере - это приведет к зависанию программы).

Пример:

unit ufCreateProcess;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
  Button1: TButton;
  procedure Button1Click(Sender: TObject);
private
  { Private declarations }
public
  { Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

//Функция для создания нового процесса
//Параметры:
// aCommand:  Строка для выполнения исполняемого файла(полный путь)
// aShow:     Показывать/не показывать окно нового процесса
// aWaitExit: Ожидать/не ожидать завершения процесса
function ExecCmd(const aCommand: String;const aShow, aWaitExit: Boolean): Boolean;
var
pi:PROCESS_INFORMATION;
si:STARTUPINFO;
cmdLine,Path: String;
begin
Result := False;
ZeroMemory(@si,sizeof(si));
si.cb:=SizeOf(si);
si.dwFlags := STARTF_FORCEONFEEDBACK+STARTF_USESHOWWINDOW;
if aShow then si.wShowWindow := SW_SHOWNORMAL else si.wShowWindow := SW_HIDE;
Path := ExtractFilePath(aCommand);
cmdLine := aCommand;

Result :=
       CreateProcess( nil,             // No module name (use command line).
                      PChar(cmdLine),  // Command line.
                      nil,             // Process handle not inheritable.
                      nil,             // Thread handle not inheritable.
                      False,           // Set handle inheritance to FALSE.
                      0,               // No creation flags.
                      nil,             // Use parent"s environment block.
                      PChar(Path),     // Use parent"s starting directory.
                      si,              // Pointer to STARTUPINFO structure.
                      pi );             // Pointer to PROCESS_INFORMATION structure.
if Result then
begin
  CloseHandle(pi.hThread);
  if aWaitExit then WaitForSingleObject( pi.hProcess, infinite );  
  CloseHandle(pi.hProcess);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ExecCmd(ExtractFilePath(ParamStr(0))+"pkzip test.zip",True,False);
end;

end.

Отвечали: Panov, Piter



Страницы: 1 вся ветка

Текущий архив: 2004.12.26;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.025 c
1-1102685710
mefisto
2004-12-10 16:35
2004.12.26
Как захватить текущий URL из окна Internet Explorer.


14-1102156124
Kirill
2004-12-04 13:28
2004.12.26
Восстановления ассоциации Delphi с файлами


8-1096524938
Alex_s
2004-09-30 10:15
2004.12.26
Icon image not valid


3-1101969512
Ann
2004-12-02 09:38
2004.12.26
SQL запрос. Подскажите пожалуйста.


1-1102685183
liver
2004-12-10 16:26
2004.12.26
MDI