Jak po odpaleniu zewnętrznego programu przechwycić momemt

0

Mam takie polecenie:

ShellExecute(0, 'open', PChar(ExtractFilePath(Application.Exename) + 'rar.exe'), PChar('a -r -y -sfx -ep1 -zparam.txt PFRON ' +  PFRONPath + '\*.*'), PChar(BackupF + '\tmp'), SW_HIDE);

które odpala mi rara, który kompresuje potrzebne pliki. Zaraz po tym muszę jednak dokońać kilku operacji na nowoutworzonym archiwum (m.in. skopiować go w kilka miejsc). No i tu pojawia się problem, jako że program nie czeka na wykonanie (zamknięcie okna) programu wywołanego przez ShellExecute, tylko działa dalej i np. kopiuje jeszcze niekompletny plik.
Na razie stosuje po ShellExecute polecenie

Sleep(3000);

ale jest to rozwiązanie ze wszech miar złe (albo za długi czas oczekiwania i duży margines błędu albo krótki czas i ryzyko że zawalony innymi procesami komputer nie zdąży).

Jak z poziomu mojej aplikacji wykryć czy ta wywołana przez ShellExecute się już zakończyła? Zapewne trzeba pokombinować trochę z uchwytami, ale nie bardzo wiem jak się do tego zabrać....

0

procedure TForm1.Button1Click(Sender: TObject);
var SI:TStartupInfo;
PI:TProcessInformation;
S,Dir:String;
begin
Dir:=ExtractFilePath(Application.ExeName);
S:='winrar95.exe a '+Dir+'test.rar '+Dir+'.';
FillChar(SI,sizeof(SI),0);
with SI do
begin
dwFlags:=STARTF_USESHOWWINDOW;
wShowWindow:=SW_SHOW;
cb:=sizeof(TStartupInfo);
end;
if CreateProcess(nil,PCharS),nil,nil,FALSE,NORMAL_PRIORITY_CLASS,nil,nil,SI,PI) then
with PI do
begin
WaitForInputIdle(hProcess,1000);
WaitForSingleObject(hProcess,10000);
WaitForSingleObject(hThread,10000);
CloseHandle(hProcess);
CloseHandle(hThread);
end;
end;

0

Big thx! [browar]
O to mi chodziło...

1 użytkowników online, w tym zalogowanych: 0, gości: 1