Announcement

Collapse
No announcement yet.

2 Fragen zur Registry & C++

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • 2 Fragen zur Registry & C++

    <p>Also ich habe zwei Fragen:</p>
    <ul>
    <li>Wie kann man etwas aus der Registry lesen und in eine Datei schreiben?</li>
    <li>Und wie kann man ein Reg-File in die Regisry eintragen ohne die Bestätigung?</li>
    </ul>
    <p>Natürlich alles mit C++</p>
    <p>Ich wäre sehr froh wenn Ihr mir helfen könntet.</p>
    <p><b>Gruss Thierry Rietsch</b></p>

  • #2
    Hi,

    der Builder stellt hierfür die Klasse TRegistry bereit (siehe die Hilfe).

    hier ein klitzkleines Beispiel zum auslesen der Registry:<br>
    <pre>
    #include <Registry.hpp>
    // Eintrag lesen:
    // Beispiel für: HKEY_CURRENT_USER\Software\MySoft\Meldung = "Hallo Welt"
    Registry->RootKey = RootKey; // HKEY_CURRENT_USER
    if(Registry->OpenKey(Key, false)){ // Key = Software\MySoft\
    sRegWert = Registry->ReadString(Name); // Name = Meldung; sRegWert ist dann "Hallo Welt"
    Registry->CloseKey();
    }
    // Eintrag schreiben, gleiche Beispiel
    Registry->RootKey = RootKey; // HKEY_CURRENT_USER
    if(Registry->OpenKey(Key, true))Registry->WriteString(Name, Wert); // Key = Software\MySoft\ ;Name = Meldung;sRegWert = "Hallo Welt"
    Registry->CloseKey();

    </pre>
    In eine Datei schreiben kann man auf mehrere Arten. Am einfachsten ist es vielleicht etwas in eine TStringlist einzulesen und dann mit SaveToFile die Datei zu schreiben.<br>
    Was Du mit der Bestätigung meinst, weiss ich nicht.

    Gruß Thorste

    Comment


    • #3
      <p>Hallo Thorsten</p>
      <p>Als erstes mal danke für deine Hilfe, werde mir das mal anschauen. Ich habe aber doch noch eine Frage: <font color="blue">Registry->RootKey = RootKey; // HKEY_CURRENT_USER</font>, ist der Text hinter den <font color="blue">//</font> ein Kommentar oder gehört der zum Quelltext?</p>
      <p>Mit Bestätigen meine Ich folgendes: Ich habe jetzt mit dem Befehl "fputs" in eine Datei geschreiben, die danach mit der Endung .reg versehen und dann das Reg-File ausgeführt via "system("start test.reg")". Dann kommt aber Windows mit der Meldung: <b>"Soll die Datei C:\Test.reg in die Registrierung....."</b>. Das möchte ich umgehen.</p>
      <p>Ich hoffe du kannst mir hier noch weiterhelfen.</p>
      <p>Wenn ich noch fragen zur TRegistry habe, kann ich dich fragen?</p>
      <p>Gruss Thierry</p&gt

      Comment


      • #4
        Jau, ich habe die Definition der Variblen vergessen:<br>
        <pre>
        HKEY RootKey;
        String Key;
        String Name;
        String sRegWert;
        String Wert;
        </pre>

        RootKeyhat den Wert HKEY_CURRENT_USER, es sind natürlich noch die anderen HKEY_... möglich.<br>
        In C++ steht hinter // ein Kommentar.

        Mit .reg Dateien habe ich noch nichts zu tun gehabt. Bisher reichte es mir in der Registry Daten zu lesen und zu schreiben.<br>

        Gruss Thorste

        Comment


        • #5
          <p>Also:</p>
          <p>1. Das was du oben geschrieben hast, wie muss ich dass definieren, d.h. wie muss ich es definieren? Wäre es so recht:</p>
          <font color="blue">
          <p>HKEY_CURRENT_USERS RootKey;<br>
          Control Panel\.. Key; <font color="black">(.. = Rest vom Pfad)</font><br>
          Test Name;<br>
          TEXT sRegWert;<br>
          String Wert; <font color="black">??????</font></font>
          </p>
          <p>Und zweitens: Wie kann man einen String ausgeben.</p>
          <p>&nbsp;</p>
          <p><b>Thierry Rietsch</b></p&gt

          Comment


          • #6
            Es ist eine ganz normale Zuweisung von Werten:
            <pre>
            HKEY RootKey = HKEY_...; // Registry Haupteinteilung
            String Key = "Software\MySoft\Options; // Registry Schlüssel
            String Name = "test"; // Auszulesende value
            String sRegWert; //Ergebnis bei Erfolg
            </pre>
            Ausgeben kann man einen String im CBuilder z.B. über TLabel (Label->Caption = sRegWert)

            Anbei nochmal zwei Funktionen, die ich mir zur einfacheren Handhabung der Registry geschrieben habe:
            <pre>
            bool __fastcall TDMReg::SetRegistryEintrag(HKEY RootKey, const String& Key,
            const String& Name, const String Wert)
            {
            bool fReturn = true;

            try{
            Registry->RootKey = RootKey;
            if(Registry->OpenKey(Key, true))Registry->WriteString(Name, Wert);
            Registry->CloseKey();
            }
            catch(...)
            {
            fReturn = false;
            }
            return fReturn;
            }
            //---------------------------------------------------------------------------
            bool __fastcall TDMReg::GetRegistryEintrag(HKEY RootKey, const String& Key,
            const String Name, String& Ergebnis, String Default)
            {
            String sRegWert = Default;
            bool fReturn = true;

            try{
            Registry->RootKey = RootKey;
            if(Registry->OpenKey(Key, false)){
            sRegWert = Registry->ReadString(Name);
            Registry->CloseKey();
            }
            }
            catch(...){
            fReturn = false;
            }
            if(sRegWert.IsEmpty()){
            Ergebnis = Default;
            }
            else{
            Ergebnis = sRegWert;
            }
            // Ergebnis = sRegWert;
            return fReturn;
            }
            //---------------------------------------------------------------------------
            // Eintrag auslesen
            String sRegEntry = "MySoftware\\Test"
            String sFile;

            GetRegistryEintrag(HKEY_CURRENT_USER,sRegEntry, "Bericht", sFile, "NULL");
            //Eintrag schreiben
            SetRegistryEintrag(HKEY_CURRENT_USER, sRegEntry, "Bericht", sFile);

            </pre>

            Gruss Thorste

            Comment


            • #7
              <p>Merci vielmals. Es läuft zwar bei mir nicht (die obere Methode), aber ich möchte dich nicht länger nerven mit meinen Fragen. PS: Vielleicht kannst du den Quelltext mal bei dir laufen lassen und schauen ob es geht</p>
              <p><font color="blue">--------------------------------------</font></p>
              <pre>
              #include <stdio.h>
              #include <conio.h>
              #include <math.h>
              #include <Registry.hpp>

              void main()
              {

              HKEY RootKey = "HKEY_CURRENT_USERS"; //Registry Haupteinteilung
              String Key = "Control Panel\\Desktop\\"; //Registry Schlüssel
              String Name = "ScreenSave_Data"; //Auszulesende value
              String sRegWert; //Ergebnis bei Erfolg

              // Eintrag lesen:
              // Beispiel für: HKEY_CURRENT_USER\Control Panel\Desktop\ScreenSave_Data = "30 39 00"
              Registry -> RootKey = RootKey; //HKEY_CURRENT_USER
              if(Registry -> OpenKey(Key, false)) //Key = Control Panel\\Desktop\\
              {
              sRegWert = Registry->ReadString(Name); //Name = ScreenSave_Data; sRegWert ist dann "30 39 00"
              Registry->CloseKey();
              }

              getch();
              }
              </pre>
              <p><font color="blue">--------------------------------------</font></p>

              <p>Also bei mir gibt es immer Fehler</p>
              <p>Gruss Thierry</p&gt

              Comment


              • #8
                Falsch:

                HKEY RootKey = "HKEY_CURRENT_USERS";

                Richtig:

                HKEY RootKey = HKEY_CURRENT_USERS
                Günther

                Comment


                • #9
                  HKEY_CURRENT_USER ist ein define (brauch also keine Anführungszeichen) und wird ohne s geschrieben (siehe Einträge in der Registry) also: HKEY Rootkey = HKEY_CURRENT_USER<br>
                  Registry muss vorher mit TRegistry *Registry = new TRegistry() definiert werden.

                  Sonst sieht es auf den ersten Blick gut aus.Voraussetzung ist das der Wert in der Registry eingetragen ist. Sonst gibt es (glaube ich) eine Exception. Zum testen komme ich leider momentan nicht :-(. <br>

                  Aber schick mal Deine Fehlermeldungen.

                  Gruss Thorste

                  Comment


                  • #10
                    <p>Die erste Fehlermeldung ist: <b>[C++ Fehler] Registry.cpp(10): E2070 Unzulässige Verwendung des Namensbereichs 'Registry'</b><br>
                    Und der zweite Fehler ist: <b>[C++ Warnung] Registry.cpp(27): W8004 'RootKey' wurde ein Wert zugewiesen, der nie verwendet wird</b>.</p>
                    <p>Ich glaube aber wenn der erste Fehler behoben ist, dann ist der zweite auch weg.</p>
                    <p>Wäre schön wenn diese Fehler auch noch verschwinden. Gruss Thierry</p&gt

                    Comment


                    • #11
                      Benenn mal die variable Registry in z.B. Reg um. Wenn ich den Fehler richtig verstehe, ist Registry anscheinend auch der Name eines Namensbereiches und dann kommt es anscheinend zum Konflikt wenn Du eine Variable gleichen Namens anlegst.

                      Oder probier doch mal dein Beispiel in einer Klasse aus, z.B. ein Formular mit einem Button und dann auf Knopfdruck die Registry auslesen. So habe ich noch kein Problem mit dem Namensbereich Registry bekommen und Du siehst schon mal ob Dein Code funzt

                      Comment

                      Working...
                      X