Newsgroup: it.comp.lang.delphi
Titolo: GetProcessfileName

In Delphi 1.0 mi funzionava, ora in Delphi 5.0 no.
In protica mi serve testare quando un programma in esecuzione si finisce.
Come posso fare?
Saluti da Christian

 Come posso fare?
potresti spiegarti meglio? Non si capisce molto quello di cui hai bisogno
...
--
- Carlo -
c.b...@libero.it

In pratica da programma delphi, lancio in esecuzione il programma ARJ per la
decopressione di alcuni archivi, ed ho bisogno di sapere quando la
decompressione è terminata.
Var
  err : Thandle;
err :=
shellExecute(Handle,'open','
command.com
',parametri,'',SW_SHOWMAXIMIZED);
if getmodulefilename(Err,parametri,50) = 0
  then codice di fine;
Il problema è che il getmodulefilename non trova nulla.

 decompressione è terminata.
Usa ShellExecuteEx per lanciare l'applicazione e 
WaitForSingleObject per attendere che il processo
entri in stato segnalato, cioe' sia terminato.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

Secondo me è il ShellExecute che non funziona bene.
procedure TMaschera.B_InstallaClick(Sender: TObject);
VAR pippo    : string[53];
    sparametri :string;
    tipo     : Char;
    i,e      : integer;
    parametri: PChar;
    para     :lpdWord;
    par      : array [1..10]  of char;
    stringa  : array [0..255] of char;
    stringo  : array [0..67]  of char;
    data1,data2,data3,data4 : filetime;
    b:bool;
    valore:word;
label vai,exit;
begin
{Copia di arj.exe nel disco locale sotto il direttorio di sistema}
Arj;
{Copia di arj.exe nel disco locale sotto il direttorio di sistema}
Carattere;
{Programma per la inizializzazione tramite Runcobol.ini con Ini2Reg}
RunCobolIni;
{Composizione riga di comando per lanciare la Batch di Installazione o
Aggiornamento}
If Windows.checked            then tipo:='1';
If WinNtServer.checked        then tipo:='2';
If WinNtWorkStation.checked   then tipo:='4';
If DOS.checked                then tipo:='3';
parametri:=@stringa;
if Oggetti.checked then par[1] := 'S' else par[1] := 'N';
if Archivi.checked then par[2] := 'S' else par[2] := 'N';
if Manuale.checked then par[3] := 'S' else par[3] := 'N';
if Banche.checked  then par[4] := 'S' else par[4] := 'N';
if CodKO.checked   then par[5] := 'S' else par[5] := 'N';
if Comandi.checked then
   Begin
   if Windows.Checked          then Par[6]:= '1';
   if WinNtServer.Checked      then Par[6]:= '2';
   if DOS.Checked              then Par[6]:= '3';
   if WinNtWorkStation.Checked then Par[6]:= '4';
   end
else
   par[6] := 'N';
sparametri := ' /c ' + Driver1.drive + ':\' + Comando +
            ' ' + Driver1.drive +
            ',' + Driver2.drive +
            ',' + par[1] +
            ',' + par[2] +
            ',' + par[3] +
            ',' + par[4] +
            ',' + par[5] +
            ',' + par[6] +
            ',' + Edit1.text;
StrPCopy(parametri, sparametri);
{Label per riprovare in caso di errori}
vai:
err :=
shellExecute(Handle,'open','
command.com
',parametri,'',SW_SHOWMAXIMIZED);
e:=err;
if e > 32 then
   Begin
{Queste di seguito sono prove per testare l'Handle}
   e:=WaitforSingleObject(err,10000);
   e:=GetLastError;
   b:=getProcessTimes(err,data1,data2,data3,data4);
   if e=WAIT_ABANDONED then e:=1;
   if e=WAIT_TIMEOUT   then e:=2;
   if e=WAIT_OBJECT_0  then e:=3;
   if e=WAIT_FAILED  then e:=4;
   e:=getLastError;
   if b= true
   then b:=false;
{-----------------------------------------------}
   Maschera.Enabled:=False;
   Timer1.Enabled:=True;
   goto exit;
   End;
case e of
  2 : pippo := 'Programma non trovato';
  3 : pippo := 'Direttorio inesistente';
 else str(e,pippo);
      pippo := 'Errore generico: ' + pippo;
end;
pippo:= pippo + '. Riprovare?';
if MessageDlg(pippo, mtInformation,[mbYes,mbNo] , 0)= mrYes
  then goto vai;
exit:
end;

Secondo me è il ShellExecute che non funziona bene.
Riprova, ShellExecute funziona benissimo.
Non ho avuto il tempo di leggere e testare il tuo codice.
-- 
Andrea Laforgia (
walkie...@libero.it
)
"Usenet is a strange place" [Dennis Ritchie]

Il risultato di ShellExecute è un tipo Handle?
Il fatto è che quando testo il processo non lo trovo