Newsgroup: it.comp.programmare.win32
Titolo: Debug ha un occhio di riguardo per RegQueryValueEx

Ok, questa non mi era ancora capitata:
uso VC++5.0 e RegQueryValueEx funziona in debug passo/passo e fallisce
altrimenti.
RegOpenKeyEx funziona (anche in esecuzione normale!!! Miracoli
dell'informatica); quindi mi ritrovo:
1) con una chiave aperta correttamente (con KEY_ALL_ACCESS) e per la quale
ho un handle valido,
2) con un valore DWORD nella suddetta chiave (l'ho inserito io a mano,
comunque anche RegSetValueEx funziona bene) che cerco di leggere
specificandone correttamente il nome,
3) con 'sta cazzo di RegQueryValueEx che mi legge i dati del valore solo in
debug passo/passo.
Quando la funzione fallisce, ritorna alle volte 87 ("parametro non
corretto"; FALSO, i parametri sono corretti; e poi perché dovrebbero essere
sbagliati solo in esecuzione normale ?) e alle volte 234 ("More data is
available." secondo Winerror.h; che cavolo ha poi a che fare con il
registro!?).
Non mi sembra nemmeno il caso di postare il codice (è una semplice chiamata
a RegQueryValueEx, con i parametri che tutti voi usate e che tutti vi
aspettereste di trovare in una chiamata del genere).
Oh! Mi viene in mente, in questo preciso istante, che non ho provato l'ormai
obsoleta RegQueryValue, ma in questo momento sono troppo nervoso per fare un
tentativo.
La domanda che mi faccio è abbastanza ovvia: "Perché in debug funziona ?";
c'è qualche preghiera da recitare ? (perché le bestemmie le ho già provate
tutte)
Non sono un principiante, ma questo è davvero troppo per il mio povero
cervellino.
Grazie per l'attenzione,
Stefano.

 aspettereste di trovare in una chiamata del genere).
La chiamata normale a questa API si fa due volte:
LONG size = RegQueryValueEx(hKey, szName, 0, 0, 0, 0);
char* buff = malloc(size);
DWORD dwSize = size;
DWORD dwType;
LONG rc = RegQueryValueEx(hKey, szName, 0, &dwType, buff, &dwSize);
a meno che tu non sappia con assoluta sicurezza la dimensione massima
del contenuto del valore che stai leggendo, nel qual caso puo` bastare
la seconda chiamata (la prima serve a scoprire questa dimensione).  Sei
sicuro di avere usato questa non-semplicissima, non-intuitiva sequenza?
I sintomi che riferisci suggeriscono diversamente (ad esempio, li avresti
se non inizializzassi dwSize a size).
Alex

Nel mio caso non era necessaria la doppia chiamata (il valore era un
REG_DWORD), tuttavia, il 6o parametro, avrei fatto meglio ad inizializzarlo
;-)  Bella figura! Inutile dire che tutto è andato a posto; per un semplice
'= 4' sono uscito di testa per due giorni.
Questo spiega anche perché i miei vecchi programmi (che non posso più andare
a rivedere a causa del virus dello scorso 25 aprile) funzionassero senza
problemi; non spiega però perché in debug funzionasse SEMPRE e in esecuzione
non funzionasse MAI (non era casuale). Sinceramente non è che me ne importi
molto; l'importante è che abbia risolto il problema (ehm... che tu me
l'abbia risolto).
Grazie mille,
Stefano.

l'abbia risolto).
Evidentemente il debugger faceva qualcosa che in qualche modo
"aggiustava" la situazione...
Paolo
-----------------------------------------------
  Paolo Marotta
  Computer Science, University of Pisa
  home:   
http://www.cli.di.unipi.it/~marotta
-----------------------------------------------

"aggiustava" la situazione...
Infatti in modalita' debug il VC++ pone a zero (NULL) tutte le variabili
(puntatori) non inizializzati;
cio' invece non succede in release...
Ciao,
Gianfranco