Suche registry-Profi



  • Hello....also ich hab schon letzt woche gepostet, doch keine exakte antwort bekommen.

    Ich verusch nochmal das Problem zu beschreiben:

    Innerhalb einer For-Schleife bekommt eine char* Variable einen anderen Wert (gut so!). Wenn ich das Programm debugge, zeigt diese Variable auf eine Speicherstelle an der
    Folgendes steht: "Software\\Netscape\\Netscape 6" + \x0 -- ein ganz gewöhnlicher Null-terminierter String.

    Ich rufe RegOpenKeyEx() auf:
    tmp wird im Original anders initialisiert, zeigt aber genauso auf eine Null-terminierte Speicherstelle

    HKEY phkResult;
    int err;
    char *tmp = "Software\\Netscape\\Netscape 6\x0";
    
    err = RegOpenKeyEx(HKEY_LOCAL_MACHINE,(LPCTSTR)tmp,(PHKEY)&phkResult);
    

    Ob ich type-casts verwende oder nicht, macht keinen Unterschied. Habe ich meine Maschine gerade frisch gestartet und beginne zu debuggen, erhält err den Wert "57". Laut winerror.h eine Hardware-Fehler meines Netzwerk-Adapters 😕

    Dann stoppe ich den Debug-Prozess, ersetzte "(LPCTSTR)tmp" mit "Software\\Netscape\\Netscape 6", starte den Debugger und siehe da, die Funktion liefert 0 zurück.

    Dann ersetze ich "Software\\Netscape\\Netscape 6" mit "(LPCTSTR)tmp", starte den Debugger und siehe da, die Funktion liefter wieder 0 zurück!!!

    Ich habe da verschiedene Registry-Pfade, aber alle funktionieren erst, wenn ich sie vorher schon einmal mit dem direkten Parameter "Software...." geöffnet habe, und dann erst mit einer Variable. Ansonsten bekomm ich den Netzwerk-Adapter-Hardware-Error ??!!!!

    Hat irgendwer einen Rat, ich bin schon am Verzweifeln 😞

    Achja, es ist auch egal, ob ich RegOpenKey() oder RegOpenKeyEx() verwende. System ist WinXP und VC++ 6



  • Hast du Schreibrechte in HKLM?



  • ja, sicherlich.....sonst würds ja auch nicht gehen, wenn ich als Parameter "Software\..." anstatt tmp verwende......

    hab mir das auch schon öfters gedacht, aber das kanns nicht sein.....



  • Wieso nicht so?

    char dest[256]="Software\\Netscape\\Netscape 6";

    if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,dest,0,KEY_ALL_ACCESS,&hkey)==ERROR_SUCCESS)



  • ....weil dadurch der Rückgabewert genauso 57 ist, nur, dass dieser vorher nicht in einer Variable gespeichert wird und somit im Debugger gar nicht angezeigt werden kann. Die IF-Anweisung wird also nie TRUE ergeben....

    [ Dieser Beitrag wurde am 04.02.2003 um 15:59 Uhr von Sneaker editiert. ]



  • Was liefert den GetLastError(); ?

    [ Dieser Beitrag wurde am 04.02.2003 um 16:13 Uhr von flenders editiert. ]



  • GetLastError() liefert 0 .....



  • Hast du schon LPCTSTR tmp = "Software\\Netscape\\Netscape 6\x0"; probiert?

    [ Dieser Beitrag wurde am 04.02.2003 um 16:49 Uhr von flenders editiert. ]



  • versuche dies:
    temp[strlen (temp)] = '\0' ;



  • Also ich hab das Problem gelöst. Der String war Null-terminiert, aber:

    @flenders: Deine Methode funktioniert, egal ob mit char* oder LPCTSTR
    @toom: Die Null war da, das hat also nicht funktioniert

    Das Problem lag am String:

    Wenn ich mit tmp mit

    char *tmp = "Software\\Netscape\\Netscape 6\x0"
    

    initialisiere, ersetzt er die beiden "\" im Speicher durch "\". Lese ich jetzt aber eine Datei aus, in der ebenfalls "\" steht, so befindet sich dann im Speicher 2 Backslashes und das ganze schlägt fehl.

    Der Fehler war also, dass mein String im Speicher mit 2 "\" geschrieben war....


Anmelden zum Antworten