Newsgroup: it.comp.programmare.win32
Titolo: Handle

ciao,
A quali rischi puo' andare incontro un'applicazione che non chiude gli
handle? Mi spiego, usando il tool per monitorare le prestazioni, negli
strumenti di Windows2000 ho notato che il numero di handle della mia
applicazione VB cresce indefinitivamente, parte da una cinquantina, per
arrivare a diverse centinaia nell'arco di un giorno.
Ho scoperto che gli handle vengono lasciati aperti dalla CreateProcess,
nonostante io chiuda i due handle con CloseHandle (che pero' ritorna il
valore FALSE, e quindi mi fa pensare che non faccia il suo dovere).
Qualcuno ha qualche nozione sull'argomento?
Grazie
Filippo

:

Dopo un po' la tua applicazione e le altre applicazioni in funzione sul 
sistema inizieranno a funzionare in modo irregolare (o a non funzionare più 
del tutto).
Hai provato a controllare cosa ti ritorna GetLastError dopo che hai chiuso 
l'handle? Sei sicuro che l'handle che chiudi sia lo stesso che ti ha 
tornato la create process (puoi convertire il valore in un long per 
controllare)? Sei sicuro che sia proprio quella la causa del resource leak 
(se lavori con windows nt/2000 puoi utilizzare il performance monitor e 
controllare che il conto degli handle aumenti sempre in corrispondenza 
della createprocess e non diminuisca dopo le close)?
Per controllare quali handle sono allocati per il tuo processo, puoi 
utilizzare handleex, lo puoi scaricare da 
www.sysinternals.com
.
-- 
Valter Minute
min...@inwind.it
 (the reply address of this message is invalid)

 utilizzare handleex, lo puoi scaricare da 
www.sysinternals.com
.
Già utilizzavo il Perfomance Monitor (il numero degli handle sale
continuamente), comunque grazie per il link, grazie a quell'applicazione ho
potuto appurare che gli handle rimasti sono veramente quelli lasciati dalla
create process (si tratta di handle di tipo process e thread). Purtroppo la
GetLastError() non mi aiuta, la lancio subito dopo CloseHandle e mi ritorna
0, come se non ci fossero stati errori.
Ho provato ad utilizzare un codice trovato su CodeGuru che lancia
un'applicazione utilizzando ShellExecute e poi aspetta la sua conclusione
aspettando la chiusura del nuovo processo. Anche quest'applicazione lascia
due handle ad ogni ShellExecute, nonostante nel codice ci siano le
CloseHandle. Mi viene da pensare che il problema sia relativo al Visual
Basic, perchè in VC non ho mai avuto problemi simili.
Hai qualche altra idea?
Questo e' l'estratto del mio codice (ad eccezione degli handle, funziona
egregiamente):
NameStart.cb = Len(NameStart)
NameStart.dwFlags = 1
NameStart.wShowWindow = 0
X = CreateProcessA(0&, CmdLine$, 0&, 0&, 1&, NORMAL_PRIORITY_CLASS, 0&, 0&,
NameStart, NameOfProc)
X = WaitForSingleObject(NameOfProc.hProcess, INFINITE)
B = CloseHandle(NameOfProc.hProcess)
B = CloseHandle(NameOfProc.hThread)
ciao,
Filippo


Ma la WaitForSingleObject funziona?
(se il programma lanciato si chiude rapidamente, prova a lanciare la 
calcolatrice o qualcosa di simile)
La CloseHandle potrebbe avere il comportamento che tu illustri se l'handle 
vale 0. 
Tieni presente che CreateProcess modifica l'ultima struttura che gli viene 
passata come parametro, potrebbe darsi che VB la passi "by val" facendo una 
copia temporanea della struttura, senza poi recuperare i valori modificati 
(quindi handle e id di thread e processo).
Comunque sono sicuro che CreateProcess funziona anche da VB (purtroppo il 
mio collega che potrebbe confermare e aggiungere un po' di codice di 
esempio è fuori ufficio...). 
