Newsgroup: it.comp.lang.delphi
Titolo: come chiudere un'applicazione esterna?

Salve a tutti,
premettendo che non son oun esperto programmatore in Delphi... vi
chiedo:
come devo fare per creare un'applicazione che sia in grado di chiudere
altre applicazioni non DDE? Che comando/i usare per chiudere
un'applicazione in funzione?
grazie a tutti dell'aiuto
-- 
 /\     Giuseppe "Mitsuhashi" Lanzi
/  \       developer & web-builder
\  /
 ||     "Bisogna assolutamente vivere 
 ||   tutte le cose che ci stanno attorno 
 ||    tenendo conto del  loro destino"
 ||
 ||           fondatore della 
 ||        "Anderson & Mitsuhashi"
 ||   associazione culturale per lo studio
 ||    e lo sviluppo dei Giochi di Ruolo

un'applicazione in funzione?
Il metodo migliore credo sia quello che prescinde dal DDE (che tra
l'altro e' obsoleto e non piu' supportato) e cioe' recuperare l'handle
della finestra e da essa quello del processo, aprire il processo
(sotto NT con SYNCHRONIZE) e poi spedire un messaggio WM_CLOSE alla
finestra principale. Con DDE, comunque, dovrebbe esserci la
possibilita', se non ricordo male, di far eseguire delle macro
all'applicazione esterna.
--
Andrea Laforgia (
andrea_...@bigfoot.com
)
-----------------------------------------------------
"There is nothing better for understanding a kangaroo
 than seeing it jump." [D.Grune, C.J.H. Jacobs]
-----------------------------------------------------

un'applicazione in funzione?
ma credo che non c'è problema se l'applicazione è DDE o meno.....insomma con
la TerminateProcess la dovresti mettere a ko tranquillamente.
In pratica la "TerminateProcess" vuole l'handle del processo da chiudere che
puoi ottenere con la "OpenProcess" e poi vuole il codice di chiusura del
processo che ottieni con la "GetExitCodeProcess".
La "OpenProcess" vuole 3 parametri di cui uno è l' ID del processo da
chiudere.
L' ID lo puoi ricavare con la "GetWindowThReadProcessId".
Ok, se hai problemi scrivi.....qualcuno risponderà certamente !!
P.S. Leggi il Win32SDK per maggiori dettagli !!
Ti saluto...
Antonio Tarolla

la TerminateProcess la dovresti mettere a ko tranquillamente.
Attenzione, pero', la TerminateProcess "killa" un processo, che non
vuol dire chiudere l'applicazione. Per chiudere un'applicazione, basta
spedire un messaggio WM_CLOSE alla main window.


spedire un messaggio WM_CLOSE alla main window.
E cosa ti fa credere che l'applicazione abbia una finestra?
In generale č meglio utilizzare GetExitCodeProcess/ExitProcess per terminare
un'applicazione, e solo in casi estremi TerminateProcess.
Se l'applicazione č a finestre conviene utilizzare WM_SYSCOMMAND con
SC_CLOSE (Stefano Carboni)
Ciao
--
- Carlo -
BSSoftware Tips Mailing-List Support

??? Come no? TerminateProcess termina processo e tutti i threads!
TerminateProcess non e' la via piu' sicura per chiudere un processo.
E' vero, l'applicazione potrebbe non avere una finestra, pero' resta
il fatto che con TerminateProcess non viene comunicato alle DLL
collegate al processo che esso sta per terminare, cosi' come tutti i
processi figli non vengono chiusi e non e' detto che il processo venga
realmente rimosso dalla memoria.
ExitProcess e' soggetta alle stesse regole, tranne per il fatto che
comunica alle DLL collegate lo stacco del processo.
Sotto NT, poi, tutte queste operazioni si complicano, per via dei
privilegi.


realmente rimosso dalla memoria.
I Processi figli non vengono terminati, ma il processo interessato si! Tutti
gli oggetti vengono rimossi dalla memoria quando chiamo CloseHandle().


processo!
In effetti quelle considerazioni sulle DLL e roba varia le ricordavo
proprio per aver letto l'SDK, cosi' come il consiglio di utilizzare
l'API con molta cautela. Non ho mai utilizzato
TerminateProcess/CloseHandle, direttamente, quindi evito di
pronunciarmi. Per il resto, posso affermare con certezza che il metodo
migliore per chiudere un'applicazione che abbia una finestra
principale e' quello di usare il messaggio WM_CLOSE.


 usare il messaggio WM_CLOSE.
ringrazio tutti dell'aiuto che mi state dando... ma vi devo ancora
disturbare... purtroppo non ho mai avuto a che fare con comandi per
altri processi... e sono completamente disistruito.
Volendo aprire il processo per ottenere il rispettivo handle, utilizzo
openprocesso, giusto? E poi mando un messaggio postmessage(handle,
WM_close, NULL, NULL), giusto?
ok... ci sono, ho capito come funziona, ma non ho capito come faccio ad
avere il processID di un programma già in esecuzione? E' indispensabile
per la funzione Openprocess (che non è veggente).
Fondamentalmente sto facendo le prove cercando di chiudere il
getright... ho cercato di capire come fare... ma niente.. potreste dirmi
come ottenere il processid, e magari se il ragionamento è giusto
(ricapitolando, ottengo il processid, faccio openprocess, ottengo
l'handle che poi uso per mandare il messaggio di WM_close)
grazie ancora di tutto
a presto


l'handle che poi uso per mandare il messaggio di WM_close)
Esatto. :)
E magari ci aggiungi un bel WaitForSingleObject, con timeout o senza,
per controllare l'avvenuta chiusura.


in cui scrive l'id del processo.
In aggiunta : per ottenere l'handle della finestra, puoi usare
FindWindow().


spedire un messaggio WM_CLOSE alla main window.
di quello che ne so ed ho letto molte volte, la "TerminateProcess" è la via
crudele per chiudere processo.
Riguardo il WM_CLOSE, se non erro non tutte le applicazioni rispondono bene
a questo messaggio.
Sempre se non erro, tempo fa qualcuno chiedeva come chiudere Internet
Explorer visto che il WM_CLOSE falliva o non ricordo cosa.
Poi non è detto che tutte le applicazioni abbiano una finestra.
Comunque basta provare e vedere qual'è la via migliore.
Per ora ti saluto....ciao !!
Antonio Tarolla

Comunque basta provare e vedere qual'è la via migliore.
Non so da cosa giudicare un metodo migliore dell'altro.
Io ho chiuso applicazioni con WM_CLOSE senza problemi.


principale e' quello di usare il messaggio WM_CLOSE.
WM_CLOSE è sicuramente efficace come tecnica (nonostante sia un messaggio
dal quale molte applicazioni si "proteggono"), mentre il WM_SYSCOMMAND con
parametro SC_CLOSE è più pulito e affidabile!


Io ho chiuso applicazioni con WM_CLOSE senza problemi.
ma anch'io chiudevo il mio IE con WM_CLOSE senza complicarmi tanto la vita,
poi ovviamente ci sono casi e casi !!
Vabbè, ti saluto....ciao !!
Antonio Tarolla

 Non so da cosa giudicare un metodo migliore dell'altro.
Io dico che hai ragione tu, quando dici di cercare di evitare
TerminateProcess + CloseHandle. (la CloseHandle decrementa il contatore
dell'oggetto kernel del processo e sebbene questo significhi anche [se ben
ricordo] che vengano decrementati anche quelli derivati da esso ci sono casi
in cui gli oggetti kernel di un processo non sono inherited dall'handle del
processo stesso...)
In un sistema "moderno" un processo ha una caterva di system handles
allocati quindi bisogna fare attenzione.
In linea di massima io andrei a tentativi (prima il WM_SYSCOMMAND con wParam
= SC_CLOSE alla finestra madre [EnumThreadWindows e simili] ) poi un
WM_CLOSE poi la TerminateProcess...
Ciao :-)
--
(¯`·.¸¸.·´¯`·.¸¸.-> Andrea <-.¸¸.·´¯`·.¸¸.·´¯)
AntiSpam: rimuovere il trattino basso dall'indirizzo per rispondere
AntiSpam: remove the underscore from the e-mail address to reply