Форум: "WinAPI";
Текущий архив: 2002.01.08;
Скачать: [xml.tar.bz2];
ВнизWinExec непонятка Найти похожие ветки
← →
Юрий Зотов (2001-09-11 22:40) [5]1. Нет, не ждет. Просто запускает - и все, а что будет дальше - никому не известно.
2. Получить хэндл ее процесса, а затем дождаться ее завершения и вызвать GetExitCodeProcess.
3. В хелпе других кодов нет. Надо полагать, это все.
Похоже, Вам нужно ипользовать функцию CreateProcess, которая позволяет легко совместить все "в одном флаконе". Вот рабочий пример запуска внешней программы с ожиданием ее завершения, получением кода возврата и вызовом обработчика события при завершении.
unit Unit1;
interface
uses
SysUtils, Classes, Controls, Forms, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
procedure ThreadFinished(Sender: TObject);
end;
var
Form1: TForm1;
implementation
uses
Unit2;
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
// Создаем и настраиваем второй поток. Он запустит внешнюю программу,
// дождется ее завершения, вызовет наш обработчик и даст код возврата.
with TMyThread.Create(False) do
begin
CommandLine := "Notepad.exe AutoExec.bat"; // Подставьте свое
WorkingDirectory := "C:\"; // Подставьте свое
OnTerminate := ThreadFinished
end
end;
procedure TForm1.ThreadFinished(Sender: TObject);
begin
// Внешняя программа завершилась. Второй поток больше не нужен.
with TMyThread(Sender) do
begin
Caption := IntToStr(ExitCode);
Free
end
end;
end.
=========================================
unit Unit2;
interface
uses
Windows, Classes;
type
TMyThread = class(TThread)
private
FCommandLine: string;
FWorkingDirectory: string;
FExitCode: DWORD;
protected
procedure Execute; override;
public
property CommandLine: string read FCommandLine write FCommandLine;
property WorkingDirectory: string read FWorkingDirectory write FWorkingDirectory;
property ExitCode: DWORD read FExitCode;
end;
implementation
procedure TMyThread.Execute;
var
SI: TStartupInfo;
PI: TProcessInformation;
begin
// Готовим структуру SI
ZeroMemory(@SI, SizeOf(SI));
SI.cb := SizeOf(SI);
// Пытаемся запустить внешнюю программу
if CreateProcess(nil, PChar(FCommandLine), nil, nil, False, 0, nil, PChar(FWorkingDirectory), SI, PI) then
begin
CloseHandle(PI.hThread); // Освобождаем ненужные системные ресурсы
// Ждем завершения с проверкой Terminated 1 раз в секунду.
while not Terminated and (WaitForSingleObject(PI.hProcess, 1000) = WAIT_TIMEOUT) do;
// Или получаем, или формируем код возврата (должна стоять короткая булевская схема)
if Terminated or not GetExitCodeProcess(PI.hProcess, FExitCode) then FExitCode := $FFFFFFFF;
CloseHandle(PI.hProcess) // Освобождаем ненужные системные ресурсы
end
else FExitCode := GetLastError // Запуск не получился, узнаем причину
end;
end.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.01.08;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.007 c