Oppure

Loading
Questo topic e' stato chiuso dal moderatore.
27/02/09 17:52
xeeynamo
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...
BYTE *RegGetStringB(HKEY hKey,LPCTSTR path,LPCTSTR name){
    HKEY hk;
    DWORD type=REG_SZ;
    DWORD *dwSize;
    BYTE *Return;

    RegOpenKeyEx(hKey,(char*)path,0,READ_ACCESS,&hk);
    RegQueryValueEx(hk,name,NULL,&type,Return,dwSize);

    RegCloseKey(hk);
    return Return;
}

Eppure se prima del return aggiungo printf("%s",return); mi restituisce la stringa corretta con un 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...
BYTE *RegGetStringB(HKEY hKey,LPCTSTR path,LPCTSTR name){
    HKEY hk;
    DWORD type=REG_SZ;
    DWORD *dwSize;
    BYTE *Return;

    RegOpenKeyEx(hKey,(char*)path,0,READ_ACCESS,&hk);
    RegQueryValueEx(hk,name,NULL,&type,Return,dwSize);

    RegCloseKey(hk);
    return Return;
}

Eppure se prima del return aggiungo printf("%s",return); mi restituisce la stringa corretta con un {parsed_message} terminante (quindi è tutto in regola)... Chi mi sa aiutare?:( terminante (quindi è tutto in regola)... Chi mi sa aiutare?:(
aaa
27/02/09 18:53
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 ..
aaa
27/02/09 19:31
xeeynamo
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:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

#define READ_ACCESS  0x20019


char *RegGetStringA(HKEY hKey,LPCTSTR path,LPCTSTR name){
    HKEY hk;
    DWORD dwSize=255;
    char bString[255];

    RegOpenKeyEx(hKey,(char*)path,0,READ_ACCESS,&hk);
    RegQueryValueEx(hk,name, NULL, NULL,(BYTE*)&bString, &dwSize);
    RegCloseKey(hk);
    return Return;
}

BYTE *RegGetStringB(HKEY hKey,LPCTSTR path,LPCTSTR name){
    HKEY hk;
    DWORD type=REG_SZ;
    DWORD *dwSize;
    BYTE *bString;

    RegOpenKeyEx(hKey,(char*)path,0,READ_ACCESS,&hk);
    RegQueryValueEx(hk,name,NULL,&type,bString,dwSize);

    RegCloseKey(hk);
    return bString;
}
int main(){
    printf("Test REGLib\nOSName: %s",RegGetStringB(HKEY_LOCAL_MACHINE,"SOFTWARE\Microsoft\Windows NT\CurrentVersion","ProductName"));
}

"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
aaa
27/02/09 19:37
theprogrammer
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 ...
aaa
27/02/09 19:38
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:


BYTE *pBuff = new BYTE[128];
DWORD dwSize;

RegQueryValueEx(hk,name,NULL,&type,pBuff,&dwSize); 

...

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
aaa
27/02/09 19:46
theprogrammer
Aggiungerei che deve essere

dwSize = 128;

in input ...
aaa
27/02/09 19:56
xeeynamo
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:


BYTE *pBuff = new BYTE[128];
DWORD dwSize;

RegQueryValueEx(hk,name,NULL,&type,pBuff,&dwSize); 

...

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:
aaa
27/02/09 20:08
theprogrammer
new e' una parola chiave del C++ che serve ad allocare oggetti di un certo tipo (anche di oggetti di tipi base).
aaa