Registry Key auslesen und als Pfad verwenden



  • Hi leute, hab folgendes Problem:

    String driverkey;
    
       TRegistry *ati = new TRegistry;
       ati->RootKey = HKEY_LOCAL_MACHINE;
       ati->OpenKey("System" ,false);
       ati->OpenKey("CurrentControlSet",false);
       ati->OpenKey("Services",false);
       value = ati->KeyExists("ati2mtag");
    
       if (value == false)
      {
       RadioButton14->Enabled = false;
       . 
       .. 
       .....
       delete ati;
      }
    
       else
      {
    
       ati->OpenKey("ati2mtag",false);
       ati->OpenKey("Enum",false);
       driverkey = ati->ReadString("0");
    
       ati->RootKey = HKEY_LOCAL_MACHINE;
       ati->OpenKey("System" ,false);
       ati->OpenKey("CurrentControlSet",false);
       ati->OpenKey("Enum",false);
       ati->OpenKey(driverkey,false);
       ati->OpenKey("Device Parameters",false);
       driverkey = ati->ReadString("VideoID");
       delete ati;
      }
    

    Warum kann ich keine Keys im Format "bla\bla\blava\" als Registrypfad verwenden ??
    Ixch möchte somit immer dynamisch den aktuell verwendeten Grafiktreiber (oder eher gesagt sein Key) holen und verwenden.

    Mit driverkey = ati->ReadString("VideoID") möchte ich mir den endgültigen
    Schlüssel( {12&455.............} ) holen und verwenden.

    Verwendet wird er so:

    TRegistry *mb = new TRegistry;
       mb->RootKey = HKEY_LOCAL_MACHINE;
       mb->OpenKey("System" ,false);
       mb->OpenKey("CurrentControlSet",false);
       mb->OpenKey("Control",false);
       mb->OpenKey("Video",false);
       mb->OpenKey(driverkey,false);
       mb->OpenKey("0000",false);
       mb->OpenKey("OpenGL",false);
       mb->WriteInteger("OGLWaitVerticalSync",0x00000003);
       delete mb;
    

    aber warum funktioniert das so nicht ?

    Bin euch so dankbar !



  • Zero01 schrieb:

    Warum kann ich keine Keys im Format "bla\bla\blava\" als Registrypfad verwenden ??

    Wer sagt, dass du das nicht kannst?



  • Jansen schrieb:

    Wer sagt, dass du das nicht kannst?

    Doch ,habs eben selbst gemerkt, Danke. Aber es funktioniert immer noch nicht da ab
    Local Machine
    System
    CurrentControlSet
    Enum

    Enum schluss ist und die IntegerWerte dann in den zu letzt aufrufbaren Key einträgt.

    String driverkey,regpath;
    
    TRegistry *ati = new TRegistry;
       ati->RootKey = HKEY_LOCAL_MACHINE;
       ati->OpenKey("System" ,false);
       ati->OpenKey("CurrentControlSet",false);
       ati->OpenKey("Services",false);
       value = ati->KeyExists("ati2mtag");    //Überprüfen ob Catalyst installiert
    
       if (value == false)
      {
       RadioButton14->Enabled = false;
       Button6->Enabled = false;
       delete ati;
      }
    
       else
      {
    
       ati->OpenKey("ati2mtag",false);
       ati->OpenKey("Enum",false);
       regpath = ati->ReadString("0");         // Regpath im Format: bla\bla\bla
    
       ati->RootKey = HKEY_LOCAL_MACHINE;
       ati->OpenKey("System\\CurrentControlSet" ,false);  //Funktioniert !
       ati->OpenKey("Enum",false);      
    
       ati->OpenKey(regpath,false);// ab hier ist schluss mit lustig !
                                      habe Regpath in eine Datei schreiben lassen und dort wird der Pfad ordentlich angezeigt.
    
       ati->OpenKey("Device Parameters",false);
       driverkey = ati->ReadString("VideoID");
       delete ati;
      }
    
    Driverkey wird wie folgt verwendet:
    
       TRegistry *mb = new TRegistry;
       mb->RootKey = HKEY_LOCAL_MACHINE;
       mb->OpenKey("System" ,false);
       mb->OpenKey("CurrentControlSet",false);
       mb->OpenKey("Control",false);
       mb->OpenKey("Video",false);
    
       mb->OpenKey(driverkey,false);  // Hier steckt der Schlüssel des Grafiktreibers in der Registry.
    
       mb->OpenKey("0000",false);
       mb->OpenKey("OpenGL",false);
    

    Bitte helft mir, Danke !



  • Ich hab zum Pfad aus der Registry lesen immer diesen Code verwendet:

    TRegistry *registry = new TRegistry;
    
                    registry->RootKey = HKEY_LOCAL_MACHINE;
    
                    if (registry->OpenKeyReadOnly("SOFTWARE\\Borland\\Package Collection Editor\\Installed Programs\\C++Builder"))
                     {
                     String path = registry->ReadString("Path")+"Bin\\bcb.exe";
    
                     ::WinExec (path.c_str() ,0);
                     }
                    else
                     {
                     Application->MessageBoxA("Borland C++ Builder 6.0 Enterprise Edition Trial wurde nicht (oder inkorrekt) auf Ihrem PC installiert.","Fehler",0+16);
                     }
    


  • in Regpath steht das drin:

    PCI\VEN_1002&DEV_4E48&SUBSYS_00021002&REV_00\4&102ac5bc&0&00F0



  • String driverkey = "";
    
      String key1 = "System\\CurrentControlSet\\Services\\ati2mtag\\Enum";
      String key2 = "System\\CurrentControlSet\\Enum\\";
    
      TRegistry *reg = new TRegistry();
      reg->RootKey = HKEY_LOCAL_MACHINE;
      if (reg->OpenKey(key1, false))
      {
        key2 += reg->ReadString("0") + "\\Device Parameters";
        reg->CloseKey();
        if (reg->OpenKey(key2, false))
          driverkey = reg->ReadString("VideoID");
      }
      delete reg;
    


  • Jansen du bist ein Schatz ! 👍 🕶 👍
    ich bin dir was schuldig 😉

    Endlich werden die Catalyst Treiber dynamisch ermittelt.



  • Ich hoffe nur, du kopierst das nicht einfach, sondern analysierst auch, was der Code macht und wo die Unterschiede zu deinem Ansatz sind. 😉



  • natürlich hab ich den code analysiert da ich ja auch wissen wollte wo der haken sitzt 😉



  • mb->WriteInteger("OGLFullSceneAAScale",0x00000006);
    mb->WriteInteger("OGLSmoothPref",0x00000000);
    mb->WriteInteger("OGLAliasSlider",0x00000003);
    mb->CloseKey();
    delete mb;

    ist das sinnvoll 3 Keys hintereinander zu schreiben ?



  • Wieso sollte das nicht sinvoll sein?
    Du kannst soweit ich weis soviele Keys hintereinander schreiben wie du willst.



  • Du kannst WriteInteger natürlich auch in einer Schleife aufrufen.

    Aber was hat das noch mit dem Thema des Threads zu tun?
    Bitte die Faustregel beachten: ein Thema pro Thread, ein Thread pro Thema. Danke!



  • Alles kar @ Jansen, ollte nicht wegen jedem bisschen einen neuen Post reinklatschen da es ja auch unter anderem zum Thema gehört 😉

    Zum Thema: dachte das es evtl Probleme mit dem Zeiger gibt.


Anmelden zum Antworten