Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Funzione che cattura stringhe dal registro.. Crash!
Forum - C/C++ - Funzione che cattura stringhe dal registro.. Crash!

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
xeeynamo (Normal User)
Pro


Messaggi: 66
Iscritto: 14/03/2008

Segnala al moderatore
Postato alle 18:52
Venerdì, 27/02/2009
Questo topic è stato chiuso dal moderatore

Stò provando a sviluppare una piccola funzione che cattura delle stringhe dal registro di sistema di Windows, ma al passaggio che fa ritornare la stringa il programma crasha...
Codice sorgente - presumibilmente C#

  1. BYTE *RegGetStringB(HKEY hKey,LPCTSTR path,LPCTSTR name){
  2.     HKEY hk;
  3.     DWORD type=REG_SZ;
  4.     DWORD *dwSize;
  5.     BYTE *Return;
  6.  
  7.     RegOpenKeyEx(hKey,(char*)path,0,READ_ACCESS,&hk);
  8.     RegQueryValueEx(hk,name,NULL,&type,Return,dwSize);
  9.  
  10.     RegCloseKey(hk);
  11.     return Return;
  12. }


Eppure se prima del return aggiungo printf("%s",return); mi restituisce la stringa corretta con un \0 terminante (quindi è tutto in regola)... Chi mi sa aiutare?:(

PM
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 19:53
Venerdì, 27/02/2009
E cosa sarebbe

Byte

?

Il tipo di Windows semmai e' BYTE ...

E poi

Return

?

In C/C++ e' minuscolo

return

e la variabile chiamata Return non e' una grande idea ...

Insomma, quel codice e' strano, non compilabile prima di tutto ... chiarisci un po' ...

E poi, posta ANCHE il main che utilizzi per chiamarlo ..


- Se le mie risposte non vi soddisfano, ignoratele, altrimenti un "grazie" e' molto gradito ...

"Dai un pesce (programma) a un uomo e lo nutrirai per un giorno. Insegnagli a pescare (programmare) e lo nutrirai per tutta la vita." (niente pappa pronta)
PM
Avatar
xeeynamo (Normal User)
Pro


Messaggi: 66
Iscritto: 14/03/2008

Segnala al moderatore
Postato alle 20:31
Venerdì, 27/02/2009
Testo quotato

Postato originariamente da theprogrammer:

E cosa sarebbe

Byte

?

Il tipo di Windows semmai e' BYTE ...

E poi

Return

?

In C/C++ e' minuscolo

return

e la variabile chiamata Return non e' una grande idea ...

Insomma, quel codice e' strano, non compilabile prima di tutto ... chiarisci un po' ...

E poi, posta ANCHE il main che utilizzi per chiamarlo ..


okkei, vediamo di postare l'intero codice :k:
Codice sorgente - presumibilmente C#

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4.  
  5. #define READ_ACCESS  0x20019
  6.  
  7.  
  8. char *RegGetStringA(HKEY hKey,LPCTSTR path,LPCTSTR name){
  9.     HKEY hk;
  10.     DWORD dwSize=255;
  11.     char bString[255];
  12.  
  13.     RegOpenKeyEx(hKey,(char*)path,0,READ_ACCESS,&hk);
  14.     RegQueryValueEx(hk,name, NULL, NULL,(BYTE*)&bString, &dwSize);
  15.     RegCloseKey(hk);
  16.     return Return;
  17. }
  18.  
  19. BYTE *RegGetStringB(HKEY hKey,LPCTSTR path,LPCTSTR name){
  20.     HKEY hk;
  21.     DWORD type=REG_SZ;
  22.     DWORD *dwSize;
  23.     BYTE *bString;
  24.  
  25.     RegOpenKeyEx(hKey,(char*)path,0,READ_ACCESS,&hk);
  26.     RegQueryValueEx(hk,name,NULL,&type,bString,dwSize);
  27.  
  28.     RegCloseKey(hk);
  29.     return bString;
  30. }
  31. int main(){
  32.     printf("Test REGLib\nOSName: %s",RegGetStringB(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion","ProductName"));
  33. }


"RegGetStringA" è un'altra funzione di prova, anch'essa non funzionante.
riguardo il Byte avevo usato #define Byte BYTE e il fatto del Return è una comodità mia, perchè sò che quella variabile verrà passata al return, tanto il sorgente è personale :D

PM
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 20:37
Venerdì, 27/02/2009
Nella RegGetStringA la variabile Return non e' dichiarata ne' mai usata.

Posta codice che ALMENO sia compilabile ...

P.S. Ti ripeto, usare Return come variabile e Byte come tipo, non e' una buona idea ...


- Se le mie risposte non vi soddisfano, ignoratele, altrimenti un "grazie" e' molto gradito ...

"Dai un pesce (programma) a un uomo e lo nutrirai per un giorno. Insegnagli a pescare (programmare) e lo nutrirai per tutta la vita." (niente pappa pronta)
PM
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2763
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 20:38
Venerdì, 27/02/2009

il primo errore lampante che balza agli occhi è che il buffer deve essere allocato per poterne passare il puntatore.

non puoi semplicemente passare un BYTE * e pretendere di avere l'indirizzo di ritorno di un buffer valido allocato dalla RegQuery

quindi, alloca un buffer di byte nell'heap (ovvero con new) e ritorna un puntatore a quel buffer:

Codice sorgente - presumibilmente C#

  1. BYTE *pBuff = new BYTE[128];
  2. DWORD dwSize;
  3.  
  4. RegQueryValueEx(hk,name,NULL,&type,pBuff,&dwSize);
  5.  
  6. ...
  7.  
  8. return pBuff;



ah oltretutto, non puoi passare un puntatore a DWORD senza che ci sia sotto una variabile puntata... in quanto lui va a scrivere in una locazione random il numero dei caratteri letti e va in crash!

ho messo tutto in quel codice, provalo e dimmi se fuziona


Ingegnere Informatico
https://ldlagency.it
PM
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 20:46
Venerdì, 27/02/2009
Aggiungerei che deve essere

dwSize = 128;

in input ...


- Se le mie risposte non vi soddisfano, ignoratele, altrimenti un "grazie" e' molto gradito ...

"Dai un pesce (programma) a un uomo e lo nutrirai per un giorno. Insegnagli a pescare (programmare) e lo nutrirai per tutta la vita." (niente pappa pronta)
PM
Avatar
xeeynamo (Normal User)
Pro


Messaggi: 66
Iscritto: 14/03/2008

Segnala al moderatore
Postato alle 20:56
Venerdì, 27/02/2009
Testo quotato

Postato originariamente da HeDo:


il primo errore lampante che balza agli occhi è che il buffer deve essere allocato per poterne passare il puntatore.

non puoi semplicemente passare un BYTE * e pretendere di avere l'indirizzo di ritorno di un buffer valido allocato dalla RegQuery

quindi, alloca un buffer di byte nell'heap (ovvero con new) e ritorna un puntatore a quel buffer:

Codice sorgente - presumibilmente C#

  1. BYTE *pBuff = new BYTE[128];
  2. DWORD dwSize;
  3.  
  4. RegQueryValueEx(hk,name,NULL,&type,pBuff,&dwSize);
  5.  
  6. ...
  7.  
  8. return pBuff;



ah oltretutto, non puoi passare un puntatore a DWORD senza che ci sia sotto una variabile puntata... in quanto lui va a scrivere in una locazione random il numero dei caratteri letti e va in crash!

ho messo tutto in quel codice, provalo e dimmi se fuziona



naaaa, funziona alla GRANDE :love: !!!! Comunque sai spiegarmi o sai dove linkarmi/postarmi una guida dove spiega l'utilizzo di quel = new TIPO[] ? Perchè prima di tutto questa espressione la usavo solo nella programmazione Java, che tra l'altro il nostro professore (incompetente dall'altro.. basta che ci fa copiare i programmi dal libro...) neanche ci ha spiegato in cosa consiste!!! Grazie mille ancora per il codice :k:

PM
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 21:08
Venerdì, 27/02/2009
new e' una parola chiave del C++ che serve ad allocare oggetti di un certo tipo (anche di oggetti di tipi base).


- Se le mie risposte non vi soddisfano, ignoratele, altrimenti un "grazie" e' molto gradito ...

"Dai un pesce (programma) a un uomo e lo nutrirai per un giorno. Insegnagli a pescare (programmare) e lo nutrirai per tutta la vita." (niente pappa pronta)
PM
Avatar
xeeynamo (Normal User)
Pro


Messaggi: 66
Iscritto: 14/03/2008

Segnala al moderatore
Postato alle 21:18
Venerdì, 27/02/2009
Testo quotato

Postato originariamente da theprogrammer:

new e' una parola chiave del C++ che serve ad allocare oggetti di un certo tipo (anche di oggetti di tipi base).


Ok, grazie:D

PM
Pagine: [ 1 2 ] Precedente | Prossimo