Newsgroup: it.comp.programmare.win32
Titolo: Finestra "principale" ...

Un saluto a tutti.
Sto cercando delle alternative a TerminateProcess()/CloseHandle() per
terminare un processo ... so, "per sentito dire" che il TM di Windows invia
un messaggio WM_CLOSE con TimeOut di 5 secondi prima di terminare
brutalmente il processo remoto. Ora mi chiedevo "come ottengo l'handle della
finestra a cui inviare il WM_CLOSE partendo dalle info restituite dalle
ToolHelp32/PSAPI?" ... un'idea la ho, ma non so quanto sia valida ...
enumero le finestre con EnumWindows(), con l'handle di ciascuna finestra
richiamo GetWindowThreadProcessID e confronto il valore copiato in "LPDWORD
lpdwProcessId" con quello del processo che mi interessa terminare, se
combaciano invio un messaggio a quella finestra.
Non c'č nulla di meglio? Una "GetWindowFromProcessID"? :-)
Thanks per ogni help! :-)
--
- Carlo -
c.b...@libero.it

 Non c'è nulla di meglio? Una "GetWindowFromProcessID"? :-)
No, perche` - come dicevamo qualche tempo fa - il concetto di "finestra
principale" e` molto relativo.
---
Bye! Lorenzo Lutti
http://antani.virtualave.net/

 principale" e` molto relativo.
Non a caso il_principale_nel subject č tra virgolette! :-)
Ciao!


Non a caso il_principale_nel subject č tra virgolette! :-)
Non a caso, potrebbe non esistere alcuna finestra
"principale", pur essendo il programma a finestre.
--
Andrea Laforgia - walkietalkie(at)
libero.it
#exclude <windows.h>

 terminare un processo ... so, "per sentito dire" che il TM di Windows
[snip]
Ti ho scritto anche su i.c.l.delphi ... potresti provare una cosa del genere
:
  PostThreadMessage ( ThreadIDPrimario_DelProcessoDaTerminare, WM_QUIT, 0,
0);
Se l'applicazione "persiste", la termini brutalmente :)
Forse (a naso), potrebbero esserci dei problemi proprio con la parte
"persiste",
nel senso che non avresti un metodo "sicuro" (quale può essere la
SendMessageTimeOut),
per sapere che è lo stessa istanza della stessa applicazione che si è
piantata (il ThreadID può
essere riciclato mentre tu aspetti (TimeOut)).
Ad ogni modo si potrebbe risolvere con cross-check su altre informazioni
(umm.. eseguibile,
informazioni su di esso, eccetera... vabbeh ci dovrei pensare =)  ).
Ciao, Davide DG

> PostThreadMessage ( ThreadIDPrimario_DelProcessoDaTerminare, WM_QUIT, 0,
Piccola nota : effettivamente (ho fatto alcune prove), sembra funzionare
solo col
thread primario... immagino dipenda da come viene gestita la coda dei msg...
if any :)
Ad ogni modo... una soluzione "alternativa" ;P, potrebbe essere...
1) Posti il msg al thread
2) Ti ci inietti dentro (tanto per cambiare ;-) )
3) Filtri i messaggi, vedendo, in un lasso di tempo, se arriva il msg...
4) Se non arriva (e quindi probabilmente (?) non viene servita la coda),
termini il prg
o il thread.
Ciao! Davide DG.

 termini il prg o il thread.
Dimentichi il particolare che fece saltare i nervi ad entrambi ... se non
c'è una message queue su Win9x non ottengo mai il controllo nella DLL e
quindi lo hook non verrà mai caricato. :-)
Ciao! :-)


essere riciclato mentre tu aspetti (TimeOut)).
Che vuol dire "riciclato" ??


 Che vuol dire "riciclato" ??
1) Viene creato un processo A : PID = p; TID primario = t.
2) Il processo A viene chiuso dal messaggio WM_QUIT al thread primario.
   (intanto si stanno aspettando i 5 secondi di TimeOut) (*)
3) Viene creato subito dopo un processo B (*stesso eseguibile di A*)
--> Il processo B avrà PID = p e TID = t
In questo senso "riciclati", cioè che se non sono più utilizzati, vengono
riassegnati
al primo processo che ne abbia bisogno (che sia creato).
Ciò non è valido nel 100% dei casi.
4) il timeout scade: cosa fa l'applicazione che ha spedito il msg WM_QUIT ?
controlla se il processo con pid p e il tid primario t sono ancora
"assegnati".
Trova che sì, sono assegnati. *MA*, trova anche che sono assegnati per un
processo generato dallo stesso eseguibile di prima... quindi , crederà che
il processo non è terminato, e procederà ad una sua (errata) terminazione
brutale.
Non so però se la cosa possa effettivamente costituire un problema
(magari un po' di workaround).
Ciao. Davide DG

4) il timeout scade: cosa fa l'applicazione che ha spedito il msg WM_QUIT ?
Dato che non e' WM_QUIT il msg che va spedito, evito anche
di considerare il resto che hai scritto.
In ogni caso, non vedo perche' complicare inutilmente le
cose : un'applicazione chiude un'altra applicazione spedendo
WM_CLOSE, se questa non risponde in TOT secondi, la killa.
Brutale, ma efficace. Punto.


 WM_CLOSE, se questa non risponde in TOT secondi, la killa.
Guarda che non si sta complicando nulla.
Ad ogni modo, siccome questo "metodo" me lo sono inventato di sana pianta
(ma sembra funzionare!), io sono ben disposto ad accettare critiche e
suggerimenti,
ma con delle motivazioni un po' più convincenti di "MAI inviare il WM_QUIT
forzatamente all'applicazione.".
Ciao! Davide DG.
PS : spero di non aver scritto oltre le 80 linee per riga ... ho ripreso ad
usare
Outlook ... XNews si piantava di continuo :(   Non è che qlc mi consiglia un
*solido* e funzionale newsreader? Thx.

usare
Sono 72 le righe massime.

 Sono 72 le righe massime.
Eh... sapevo che avresti avuto da ridire ... infatti volevo cancellare
e riscrivere il post appena me ne sono accorto :)
Ciao. Davide DG

 quindi lo hook non verrà mai caricato. :-)
Ahem... qs post mi era sfuggito (stavo cambiando newsreader) :(
Ci sono degli aggiornamenti per questo argomento...
ho trovato (ma non ancora provato) una libreria il cui nome dovrebbe dirti
tutto : "Force Execution Library" ;PP
Ad ogni modo non mi sembra una soluzione molto comoda ;)
Ciao! Davide DG