Newsgroup: it.comp.programmare.win32
Titolo: Dubbi su apertura/chiusura applicazione.

Mi servirebbe implementare in una classe due metodi per lanciare e
chiudere la stessa applicazione (una volta sola).
qual e' il metodo migliore (leggi: piu' sicuro) per implementare il
corpo di queste due funzioni ?
Io l'ho pensata cosi' :
Premesso che 
   STARTUPINFO         si ;
   PROCESS_INFORMATION pi ;
sono private alla classe, il corpo del metodo LanciaApplicazione() lo
definirei in questo modo :
   ZeroMemory( &si, sizeof( si ) ) ;
   si.cb = sizeof( si ) ;
   if ( !CreateProcess( NULL, PercorsoProgramma, NULL, NULL, FALSE, 0,
                        NULL, NULL, si, pi ))
      Logger->LogMessage( "Impossibile caricare Blue's Miner", 0 ) ;
   else
      WaitForSingleObject( pi.hProcess, INFINITE ) ;
Ma il corpo di ChiudiApplicazione() ?
Ho dei dubbi su come fare.

:

Se fai così, ChiudiApplicazione dovrà, come minimo, essere richiamata da un 
altro thread, poichè LanciaApplicazione non ritorna fino a che non è 
terminata l'applicazione stessa (WaitForSingleObject).
Per terminare l'applicazione hai parecchie alternative (e questo stà 
diventando un problema ricorrente nel gruppo...):
1. Se l'applicazione "target" è sotto il tuo controllo prevedi un sistema 
(messaggi o meglio interfaccia COM) che permetta alla classe di 
controllarne il funzionamento).
-- se non hai la possibilità di modificare l'applicazione da lanciare:
2. Inviare alla finestra principale (o meglio a tutte le finestre top-
level) un messaggio di WM_CLOSE (o, forse meglio, WM_SYSCOMMAND-SC_CLOSE). 
Puoi recuperare la finestra usando EnumWindows e GetWindowThreadProcessID 
(confrontanto i valori con quelli tornati dalla CreateProcess). Devi 
aspettare che il target crei almeno una finestra (WaitForInputIdle, anche 
se non sempre funziona...) e il tutto, ovviamente, non funziona con le 
applicazioni che non hanno finestre.
3. Puoi provare a mandare al thread principale un messaggio di quit 
(WM_QUIT) usando PostThreadMessage. Questo funziona solo se l'applicazione 
ha un loop dei messaggi e gestisce WM_QUIT correttamente.
4. Puoi utilizzare TerminateProcess. Soprattutto con windows '95/98 questo 
approccio deve essere considerato l'ultima risorsa poichè si rischia che 
non tutte le risorse allocate dal processo vengano rilasciate.
5. C'è anche il caso di applicazioni che hanno un "launcher" che si limita 
ad eseguire un'altro programma (mi pare sia il caso, ad esempio, del client 
di cc:mail o notes). In questo caso i tuoi ID di processo non servono a 
molto e puoi utilizzare solo EnumWindows/FindWindow per trovare la finestra 
principale (dati titolo/classe) o le API per la gestione dei processi 
(diverse tra '95 e NT)
P.S. nella ChiudiApplicazione (o nel distruttore della classe), ricordati 
di richiamare CloseHandle sugli handles della PROCESS_INFO.
-- 
Valter Minute
min...@inwind.it
 (the reply address of this message is invalid)

 Ho dei dubbi su come fare.
Che ne diresti di un bel
    {
        return;
    }
???
Qualche CloseHandle per le varie handle coinvolte potrebbe essere
una buona idea, tanto per non tenere inutilmente bloccate risorse
anche in minuscola quantita`, ma tanto vale metterle nella Lancia
dopo la WaitForSingleObject.
Alex





A parte il fatto che imparare l'Arabo non mi dispiacerebbe (anche perchč 
credo che, fonetica a parte, non possa essere piů "ermetico" di parecchio 
del codice C con cui ho avuto a che fare..), credo che, per chiarirti le 
idee ti possano far comodo una serie di link:
http://www.bruceeckel.com
 - puoi scaricare un ottimo testo sul C++ (č 
gratis quindi, perlomeno, non ti ho fatto sprecare dei soldi!)
http://aleax.supereva.it
 - articoli e tutorial di Alex Martelli 
(sicuramente uno dei guru di questo newsgroup)
http://www.codeproject.com
 - esempi e tutorial sulla programmazione a 32 
bit (č tutta roba un po' "avanzata", ma il sito č organizzato bene).


di richiamare CloseHandle sugli handles della PROCESS_INFO.
Ma se io chiamo l'applicazione in LanciaApplicazione e chiudo
l'applicazione in ChiudiApplicazione, utilizzando nel primo caso
CreateProcess e nel secondo una SendMessage del WM_CLOSE (o giu' di
li'), non faccio bene a rilasciare gli handle dentro
ChiudiApplicazione ? Cioe' subito dopo CreateProcess ?

dopo la WaitForSingleObject.
Se non ho capito male, le handle le posso anche rilasciare dopo la
CreateProcess ? o necessariamente al momento della chiusura
dell'applicazione ?

 dell'applicazione ?
Se ti serve interagire con l'applicazione che hai lanciato,
le handle possono farti comodo, anche sono per sapere se e`
gia` terminata o meno ad esempio (basta la sola handle del
processo).  Per _chiudere_ l'altra applicazione, vedo che hai
gia` ricevuto molti ottimi consigli da un altro post.
Alex

 ChiudiApplicazione ? Cioe' subito dopo CreateProcess ?
CreateProcess e` in Lancia, quindi credo ci sia una certa
confusione nelle ultime due righe.  Comunque, la handle del
processo puo` servirti ad esempio per sapere se e` gia`
terminato per conto suo.
Alex

gia` ricevuto molti ottimi consigli da un altro post.
Ok, grazie :)

terminato per conto suo.
Si' esatto, CreateProcess e' in Lancia..., comunque mi interessava
capire se il rilascio delle handle influisce solo sulla mia
applicazione, nel senso che perdo le maniglie e basta :), oppure sul
sistema, nel senso che rilasciando le maniglie, faccio qualche casino.
Visto che mi sembra che cosi' non sia, posso anche rilasciarle in
LanciaApplicazione, dato che non le utilizzo piu' da quel momento in
poi.