PDA

Visualizza versione completa : [C] FindWindow mi ritorna sempre 0


Alhazred
06-09-2007, 11.53.41
Nel mio programma che simula un servizio di posta elettronica sto scrivendo il codice per non consentire che un utente effettui un login se risulta già loggato.
Per fare questo ho pensato di far creare al server un array dove inserisce gli username degli utenti che man mano si loggano, in questo modo se si prova a fare un nuovo login con lo stesso nome utente si ha in risposta che l'utente è già loggato perché presente nell'array utentiLoggati. Tutto questo funziona.
Il problema nasce nel momento in cui un utente chiude il suo client.
Devo fare in modo che il suo nome venga rimosso dall'array utentiLoggati.
Ho pensato di risolvere impostando come titolo della console del client l'username di chi la sta usando, in tal modo controllando ciclicamente gli handle delle finestre aperte (il programma si usa in locale) riesco a vedere se il client è ancora aperto oppure è stato chiuso.
Il server legge l'array degli utenti loggati e per ogni posizione controlla se esiste una console aperta con il nome trovato come titolo, ma FindWindow ritorna sempre NULL, anche se una console con il nome che sta cercando è aperta.


for(i = 0; i < MAX_UTENTI; i++) {
if(FindWindow(NULL,utentiLoggati[i]) == NULL) {
printf("Utente controllato: %s\n",utentiLoggati[i]);
strcpy(utentiLoggati[i]," ");
i = MAX_UTENTI;
utentiOn--;
}
}

printf("Utente controllato: %s\n",utentiLoggati[i]);
riporta il nome contenuto nell'array ed è uguale a quello della console aperta, quindi FindWindow non dovrebbe ritornare NULL, ma un handle valido, perché non lo fa?

P8257 WebMaster
07-09-2007, 01.11.09
Mmmm.... ciao Alh, come va ? ;)

Ogni tanto rispunto .... ho 3 appunti da fare..

1 - Eviterei di usare i titoli delle finestre per controllare se un client è connesso al server, ricordati che gli handle sono oggetti pubblici quindi anche se la tua applicazione gira in locale, è come mettere su ogni finestra un bel postit con scritto il proprio numero di carta di credito.... Perché non usi una bella area di memoria mappata come ormai sai benissimo fare dalla battaglia navale ? Ti eviterebbe anche il polling...

2 - Piuttosto di usare FindWindow, userei FindWindowEx perché la tua finestra potrebbe non essere rilevabile al "primo livello", quest'api infatti esegue solo scansione top-level (ed è questo secondo me il problema)

3 - Controlla che nell'array che passi, il terminatore sia alla stessa posizione in cui te lo aspetti quando controlli il nome della finestra, per inciso, potrebbe esserci uno spazio tra l'ultima lettera del nome della fienstra e il terminatore....

Ciao!

Alhazred
08-09-2007, 11.12.11
Ciao :D
tutto ok e felice di ritrovarti :)

Il problema dell'handle è risolto, avevo solo considerato LF e CR trascurando \0

Ora devo capire perché il codice dentro l'if fa danno non facendomi riconoscere se un utente è già on o no :p

P8257 WebMaster
08-09-2007, 14.41.58
Forse un'idea ce l'ho ....... ;) .. una STRana idea :D

Alhazred
10-09-2007, 15.43.28
Credo che la scrittura sull'array sia corretta anche per la STRana idea che ti era venuta.
Il problema deve stare nelle condizioni con le quali si decide "quando" e "come" operare sull'array, ovvero la fine del main nel processo server.
Se ti va di darci un'occhiata ecco i codici:
http://lacasa.altervista.org/software/mail.zip

Il file di testo contiene user e pass di qualche utente e deve trovarsi all'interno della cartella da dove fai partire il server.

Per accorgerti del problema prova a loggare 2 utenti e guarda che succede quando ne fai loggare un terzo... il secondo sparisce e gli utenti loggati secondo il contatore non sono 3 ma 1 (accade anche quando dovrebbero essere 2, ne risulta sempre 1), questo perché vengono eseguite le istruzioni dentro l'if che controlla se l'handle è non valido e gli utenti on sono più di 1.
Ho tolto tutte le funzioni che vanno bene per alleggerire la lettura del codice.

LoryOne
11-09-2007, 13.02.35
Forse il Web si riferiva a strcpy(utentiLoggati[i]," ");

Alhazred
12-09-2007, 15.57.24
Ho provato anche con "\0" invece di " ", ma il problema del mafunzionamento non penso sia quello, il problema sta nel fatto che quel codice viene eseguito quando non dovrebbe.
Quel codice deve essere eseguito solo se nell'array degli utenti loggati c'è un nome al quale non corrisponde nessuna console aperta, invece a parte per il primo login, per i successivi viene sempre eseguito, anche se nell'array degli utenti loggati non ci sono nomi ai quali non corrisponde una console aperta.
Il confronto tra nome nell'array e titolo della console deve essere giusto, altrimenti avrei NULL anche per il primo login che invece mi ritorna un handle valido (provato anche con una printf), quindi l'errore deve essere da un'altra parte... ma dove???

Alhazred
12-09-2007, 17.09.50
Credo di aver trovato il problema, FindWindow sul server partiva prima che il titolo della console del client venisse rinominata, ho aggiunto uno Sleep(2000) prima del controllo e adesso sembra che vada :D