Форум: "WinAPI";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];
ВнизЗапуск внешнего приложения через 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 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.039 c