Newsgroup: it.comp.lang.delphi
Titolo: aprire e chiudere un'appl - probl c on handle - un po' lungo xchè con cod ice

Ciao,
innanzitutto faccio gli auguri a tutti!
E poi, per non farvi perdere l'allenamento (dopo le leccornie 
natalizie), vi sottopongo questo problema.
Finalità dell'appl:
Devo fare un programma che sia una specie di sequenziatore di programmi: 
cioè una appl in cui si imposta una lista di prog, l'ora di inizio e 
fine di ogni programma, e questa lista viene processata giornalmente.
Il funzionamento è chiaro e semplice, il prog è tecnicamente facile, ma 
nonostante questo ho avuto questo
Problema:
Quando avvio un'applicazione uso la funzione
CreateProcess(nil,PChar('PROGRAM_FILE PARAMS'), nil, nil, false, 
Normal_Priority_Class, nil, nil, SI, PI);
dove
PROGRAM_FILE = applicazione da usare (es.:c:\windows\notepad.exe)
PARAMS = eventuali parametri da usare (file da aprire o altro)
però al momento di dover chiudere questa appl appena avviata non riesco 
a ritrovarne l'handle per ucciderla. Per ora sono arrivato a questo 
punto (dopo qualche ricerca in rete):
function prova (Handle: THandle; List: TStringList):boolean; stdcall;
var
   Buffer : array[0..255] of Char;
begin
   // righe di controllo
   // SendMessage(Handle, WM_GETTEXT, 255, integer(@Buffer[0]));
   // if IsWindowVisible(Handle) = True then
   //	begin showmessage(buffer); showmessage(inttostr(handle)+' 		  // 
   '+inttostr(proc)); end;
   // proc è una var globale = PI.hProcess salvata dopo il CreateProcess
   if proc=Handle then postmessage(Handle,WM_CLOSE,0,0);
   result:=true;
end;
procedure TForm1.cercaClick(Sender: TObject);
var  a:TStringList;
begin
   EnumWindows(@prova, LParam(a));
end;
ma facendo un controllo (vedi righe di controllo) ho visto che, quando 
trova la finestra che mi interessa, ha un handle diverso da quello che 
ho in PI.hProcess.
Non essendo molto esperto vi chiedo:
1) E' normale che ci sia questo differenza (magari perchè i due handle 
si riferiscono a cose diverse)?
2) Esiste una via più semplice per fare tutto ciò?
3) Se questa è una soluzione accettabile, come faccio a trovare e 
uccidere l'appl (o il suo handle)?
Questo prog deve girare su Win2K o XPSP1.

 fine di ogni programma, e questa lista viene processata giornalmente.
Sei sicuro che il servizio "Utilità di pianificazione" di XP non vada
ugualmente bene ?  Lo puoi comandare mediante il comando AT oppure
mediante le API dello Scheduler.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

Grazie, adesso ci provo.
Eventualmente, solo per mia cultura, quale sarebbe la soluzione seguendo 
la strada che avevo intrapreso (handle e simili)? [Se c'è la strada]
Cmq, grazie lo stesso per il consiglio.
Fabio


 la strada che avevo intrapreso (handle e simili)? [Se c'è la strada]
La strada c'è, ma strano che possa sembrarti, sotto Windows (e non solo),
il modo di avviare un'applicazione è abbastanza semplice, ma quello per
chiuderla è tutt'altro che intuitivo.  Un'applicazione, una volta
lanciata, può eseguire una miriade di operazioni e, seppure dal sistema
operativo sia previsto un meccanismo per comunicare con essa e permetterle
di chiudersi in modo "pulito" (sotto Windows mediante messaggi, sotto UNIX
mediante segnali) non è detto che l'applicazione in quel momento stia
"ascoltando".  Teoricamente, il metodo assolutamente sicuro per chiudere
un'applicazione è quello di "killare" il processo in modo brusco mediante
l'API TerminateProcess.  Comunque tieni presente che il servizio di cui ti
ho parlato serve a _lanciare_ delle applicazioni a determinati orari, in
determinati giorni e/o con una certa periodicitià, ma, almeno che io
ricordi, non consente di chiuderle in modo forzato.  Personalmente ritengo
sia un errore doverlo fare, ma non conosco bene il tuo problema.


Grazie mille per la risposta!
Il mio problema è proprio quello di aprire e chiudere programmi in modo 
rigido (con orari fissi), anche se questo prevede "killare" il processo.
Comunque sei stato molto chiaro nella tua spiegazione e di questo ti 
ringrazio.
Fabio


 ha scritto nel messaggio
news:jboAd.341119$b5.16...@news3.tin.it...
