Wracam do tematu, ponieważ sposób zaproponowany przez "lankusieka" nie zawsze działa poprawnie, być może dla tego, że ja muszę uruchomić drugi program jako SW_HIDE, oraz z parametrami. Kod który umieszczam poniżej realizuje dokładnie to, o co mi chodziło:
unit uMain1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ShellAPI, ExtCtrls ;
type
TForm1 = class(TForm)
btnStart: TBitBtn;
memoMsg: TMemo;
procedure btnStartClick(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
function runProcess(ExeFile : PChar) : TProcessInformation;
procedure waitForProcessEnd(PI : TProcessInformation);
public
{ Public declarations }
end;
const exeFile = 'WinAudit.exe /r=gsoPxuTUeERNtnzDaIbMpmidcSArBLF /o=XML /L=pl';
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormShow(Sender: TObject);
begin
memoMsg.Lines.Clear;
end;
procedure TForm1.btnStartClick(Sender: TObject);
var PI : TProcessInformation;
begin
memoMsg.Lines.Clear;
memoMsg.Lines.Add('Process '+IntTostr(PI.hProcess)+' start ...');
PI := runProcess(PChar(exeFile));
memoMsg.Lines.Add('works ...');
waitForProcessEnd(PI);
memoMsg.Lines.Add('Process end ...');
end;
function TForm1.runProcess(ExeFile : PChar) : TProcessInformation;
var SI : TStartupInfo;
PI : TProcessInformation;
begin
FillChar(SI,sizeof(SI),0);
FillChar(PI,sizeof(PI),0);
Result := PI;
with SI do
begin
dwFlags:=STARTF_USESHOWWINDOW;
wShowWindow:=SW_HIDE; // SW_SHOW
cb:=sizeof(TStartupInfo);
end;
if CreateProcess(nil,ExeFile,nil,nil,false,NORMAL_PRIORITY_CLASS,nil,nil,SI,PI) then
Result := PI
end;
procedure TForm1.waitForProcessEnd(PI: TProcessInformation);
begin
with PI do
begin
WaitForInputIdle(hProcess,1000);
WaitForSingleObject(hProcess,10000);
WaitForSingleObject(hThread,10000);
CloseHandle(hProcess);
CloseHandle(hThread);
end;
end;
end.
Obeszło się baz zakładania hook'a.