Newsgroup: it.comp.lang.delphi
Titolo: Attendere chiusura applicazione

Salve a tutti
sapreste indicarmi come posso far eseguire al mio progr. una procedura dopo
che venga chiusa un applicazione?
Mi spiego meglio:
procedure TMain.Button1Click(Sender: TObject);
begin
winexec('Notepad.exe', SW_SHOWNORMAL);
Main.miaprocedura;
end;
Vorrei che il progr. eseguisse "miaprocedura" solo dopo che ho chiuso
(manualmente)  il notepad.
Ciao, Tommaso.

 ha scritto nel messaggio
news:b698uf$78n$1...@newsread.albacom.net...

Usa questo:
function ShellExecExAndWait( const FileName: string; const Param: string;
const Operation: string; var ExitCode: DWord ): boolean;
  { il valore restituito dice semplicemente se ha eseguito oppure no
l'applicazione, NON dà alcuna informazione sul valore restituito dal
processo }
  var
    SEinfo: TShellExecuteInfo;
    ExecuteFile: string;
  begin
  Result := False;
  ExecuteFile := FileName;
  FillChar( SEInfo, sizeof( SEInfo ), 0 );
  with SEInfo do
    begin
    cbSize := sizeof( TShellExecuteInfo );
    fMask := SEE_MASK_NOCLOSEPROCESS; { lascia il processo "vivo" anche dopo
ShellExecute: ci pensa il parametro hProcesso a ricevere l'handle del
processo }
    Wnd := Application.Handle;
    lpFile := pchar( ExecuteFile );
    lpVerb := pchar( Operation );
    lpParameters := pchar( Param );
    nShow := SW_SHOWNORMAL;
    end;
  if ShellExecuteEx( @SEInfo ) then
    begin
    repeat
      Application.ProcessMessages;
      GetExitCodeProcess( SEInfo.hProcess, ExitCode );
    until ( ExitCode <> STILL_ACTIVE ) or Application.Terminated;
    Result := True;
    end;
  end;

     end;
Questa porzione di codice causa un Busy Wait, ovvero un grande spreco delle
risorse del processore.
Il modo corretto per eseguire un programma e aspettare che esca e':
-creare il programma con CreateProcess
-ottenere da questa chiamata il record PROCESS_INFORMATION
-ottenere dal record l'handle del processo (PROCESS_INFORMATION.hProcess);
-chiamare WaitForSingleObject su questo handle
Ciao

> Il modo corretto per eseguire un programma e aspettare che esca e':
Ecco la procedura.
Naturalmente essendo un'attesa, la procedura non ritorna finche' non finisce
il programma chiamato, e in questo modo "blocca" completamente la finestra
chiamante. Il modo corretto per ovviare a cio' e' eseguire la procedura in
un thread separato (non e' cosi' difficile come sembra). Se non sai come
fare chiedi pure.
ExecAndWait('c:\winnt\notepad.exe','');
procedure ExecAndWait( const FileName: string; const Param: string);
var pi:TProcessInformation;
    si:TStartUpInfo;
begin
ZeroMemory(@si, sizeof(si));
si.cb:=sizeof(si);
if not CreateProcess(pchar(filename), pchar(param), nil, nil, false, 0, nil,
nil,si,pi) then
 raise exception.create('Errore!');
WaitForSingleObject(pi.hProcess, infinite);
end;

if not CreateProcess(
<...>
Devi rilasciare gli handle del thread primario e del processo, dopo
WaitForSingleObject (l'ideale è nel corpo "finally").
-- 
Andrea Laforgia
www.geocities.com/andrealaforgia
"640kb of memory should be enough for anyone." -- Bill Gates.

 WaitForSingleObject (l'ideale è nel corpo "finally").
Non ho ben capito.. Cosa intendi? Puoi fare un esempio ?



try
 ...
 CreateProcess(...
 WaitForSingleObject(...
 ...
finally
  CloseHandle(pi.hThread);
  CloseHandle(pi.hProcess);
end;


 end;
Ah capisco.. ma se la createprocess ritorna false bisogna lo stesso chiudere
i due handle ?