problem mit registry funktion(en)



  • ja irgendwie wird der kleiner 😃 ... am anfang zeigt er noch ein wort mit 5 zweichen an (das wäre auch die exakte länge) ... das nächste hat dann nur noch 4 obwohl es eigentlich 7 oder so hätte und dann haben alle nachfolgenden nur noch 3 buchstaben

    aber es wäre eigentlich ein char[256] ???

    wenn ich mal was einigermaßen brauchbares hinbekommen habe (das aber vermutlich nicht funktionieren wird) poste ich es mal ...



  • probier mal

    char cName1[256] = {0};
    


  • benutzer2 schrieb:

    aber ich will später von den einzelnen, unbekannten Ordner dann Werte auslesen ... darum nehme ich jetzt KEY_ALL_ACCESS ... das funktioniert garantiert

    ...solange der User als ADMINISTRATOR am Rechner sitzt, ja.

    Versuch das als "Benutzer" oder "Hauptbenutzer" mit KEY_ALL_ACCESS und Du machst 'ne Bauchlandung...



  • Hepi schrieb:

    Versuch das als "Benutzer" oder "Hauptbenutzer" mit KEY_ALL_ACCESS und Du machst 'ne Bauchlandung...

    auch bei HKEY_CURRENT_USER 😕



  • (1)

    auch bei HKEY_CURRENT_USER?

    normalerweise nicht. Aber ab etwa 50 Nutzern lernst du ziemlich schnell das "normal" ein sehr subjektives Konzept ist.
    *Immer* mit minimalen Rechten an Dateien, Registry usw. rangehen. Ich kannte mal einen, der Dateien immer mit read/write_Rechten aufgemacht hat, auch zum lesen. Drei Tage später war er tot.

    ja irgendwie wird der kleiner

    (...,&dwData, ...)
    

    MSDN:

    lpcbData
    [in, out] Pointer to a variable that specifies the size of the buffer pointed to by the lpData parameter, in bytes. When the function returns, this variable contains the size of the data copied to lpData.

    i.a.w. dwData gibt reinzu die Länge deines Puffers an, und rauszu die Länge der eigentlichen Daten



  • re 😛

    sollte öfter in dieses Forum schauen ^^

    das ist nun das was ich bis jetzt geschafft habe und bis auf den Teil bei dem ich meine Werte auslese bzw. dann vergleichen will funktioniert glaub ich alles

    path = REGISTRYPFAD;
    
    lRet = RegOpenKeyEx(HKEY_CURRENT_USER, path, 0, KEY_READ, &hKey1);   // öffne .../Ordner
    
    do
    {
       path = "Software\\Ordner";  // bekannter Pfad
       j = jLastError = 0;   // wieder zurücksetzen
    
       if (lRet  != ERROR_SUCCESS)   // prüfen
       {
          errorMSG.Format("Unable open Registry!\nERROR: 1_%i", lRet);
          MessageBox(NULL, errorMSG, "MsgBox 1", MB_OK | MB_ICONQUESTION);
          abbruch = TRUE;
       }
       else
       {
          char cName1[256] = ""; 
          DWORD dwData1 = 256; 
    
          iLastError = RegEnumKeyEx(hKey1,i,cName1,&dwData1,0,0,0,0);
          if (iLastError == ERROR_NO_MORE_ITEMS)     // wenn im bekannten Ordner nichts mehr ist
          {                                          // Schluss, da sonst die beiden anderen
             break;                                  // Schleifen ein letztes mal durchlaufen
          }                                          // werden
          i++; 
    
          path.Format("%s\\%s", REGISTRYPFAD, cName1);
          // TEST
          test.Format("%s  iLastError:%i", path, iLastError);
          MessageBox(NULL, test, "Warning !!!", MB_OK | MB_ICONQUESTION);
          // TEST //
          buffer1.Format("%s",cName1);
       }
    
          lRet = RegOpenKeyEx(HKEY_CURRENT_USER, path, 0, KEY_READ, &hKey2);   // öffne .../Ordner/Ebene_1
    
          do
          {
    
             if (lRet  != ERROR_SUCCESS)   // prüfen
             {
                errorMSG.Format("Unable open Registry!\nERROR: 2_%i", lRet);
                MessageBox(NULL, errorMSG, "Warning !!!", MB_OK | MB_ICONQUESTION);
                abbruch = TRUE;
             }
             else
             {
                char cName2[256] = ""; 
                DWORD dwData2 = 256; 
    
                jLastError = RegEnumKeyEx(hKey2,j,cName2,&dwData2,0,0,0,0);   // suchen 
                j++; 
    
                path.Format("%s\\%s\\%s", REGISTRYPFAD, buffer1, cName2);
                // TEST
                test.Format("%s  jLastError:%i", path, jLastError);
                MessageBox(NULL, test, "MsgBox 2", MB_OK | MB_ICONQUESTION);
                // TEST //
             }
    
                lRet = RegOpenKeyEx(HKEY_CURRENT_USER, path, 0, KEY_READ, &hKey3);    // öffne .../Ordner/Ebene_1/Ebene_2
    
              //  do
              //  {
    
                   if (lRet  != ERROR_SUCCESS)    // prüfen
                   {
                      errorMSG.Format("Unable open Registry!\nERROR: 3_%i", lRet);
                      MessageBox(NULL, errorMSG, "Warning !!!", MB_OK | MB_ICONQUESTION);
                      abbruch = TRUE;
                   }
                   else
                   {
    
                      // Value "Wert" auslesen
                      readValueRet = RegQueryValueEx( hKey3, "Wert",  NULL, NULL, (LPBYTE) result, &dwBufLen);
    
                      if (readValueRet == ERROR_SUCCESS)  // Value gefunden  
                      {
                         // TEST
                         errorMSG.Format("%s", "Erfolgreich!!!");
                         MessageBox(NULL, errorMSG, "Warning !!!", MB_OK | MB_ICONQUESTION);
                         // TEST //
    
                         if((result[528] == '0') && (result[529] == '0'))
                         {
                                  gefunden++;   // wieviele Werte enthalten den das was man sucht  
                         }
                         else
                         {
                                  nichtGefunden++;  // wieviele Werte enthalten es nicht
                         }
    
                      }
                      else if (readValueRet == ERROR_FILE_NOT_FOUND)  // dieses Value gibt es nicht
                      {
                         // TEST
                         errorMSG.Format("%s", "File not found");
                         MessageBox(NULL, errorMSG, "Warning !!!", MB_OK | MB_ICONQUESTION);
                         // TEST //
                         // nichts machen
                      }
                      else   // siehe Fehlercode lRet
                      {
                         errorMSG.Format("Unable open Registry!\nERROR: 4_%i", lRet);
                         MessageBox(NULL, errorMSG, "Warning !!!", MB_OK | MB_ICONQUESTION);
                         abbruch = TRUE;
                      }
    
                   //   kLastError = ERROR_NO_MORE_ITEMS;
    
                   }
    
               // } while ( !(kLastError == ERROR_NO_MORE_ITEMS) && !abbruch);
    
          } while ( !(jLastError == ERROR_NO_MORE_ITEMS) && !abbruch);
    
    } while ( !(iLastError == ERROR_NO_MORE_ITEMS) && !abbruch);
    

    als ergebnis erhalte ich dann immer nur "nichtGefunden" ;/ ich weiß aber das auch "gefunden" drin steht

    Die Werte die ich auslese sind immer REG_BINARY ... wenn ich das aber bei "RegQueryValueEx" statt der zweiten NULL eintrage bekomme ich immer den Fehler, dass er nicht von int auf unsignd long casten kann oder sowas ??? (habe den WATCOM C/C++ Compiler ... weiß das der nicht toll ist ^^ )

    Ich habe mir hier im Forum jetzt nen paar sachen zum auslesen angeschaut, aber irgendwie verstehe ich das nicht ganz bzw. bin genau so schlau wie vorher ... will eigentlich nur diesen Wert auslesen und dann an einer bestimmten Stelle vergleichen ... das es so wie ich das oben machen nicht geht verstehe ich inzwischen ... weiß aber nicht wie es richtig geht.

    PS: Ich weiß das der Code schrecklich aussieht ... aber ich bin erstmal froh das es (einigermaßen) funktioniert ... verbessert wird nachher ^^



  • also ich lese jetzt den registry wert einfach so wie in der faq als zahl aus (obwohls binär ist)

    #define SIZE 300
    DWORD dwNumber[SIZE]; 
    DWORD dwData; 
    RegQueryValueEx(hKey,"EintragsName",NULL,NULL,(BYTE*)&dwNumber,&dwData);
    

    ich habe dann dwNumber mit 0 vorbesetzt und als int ausgeben lassen ... da stehen dann lauter 0 in den zellen. Wenn ich dann das "RegQueryValueEx" mache und es mir nochmal als int ausgeben lasse steht was anderes drin ... das zeigt doch das etwas ausgelesen wird ??? ... wie ich das jetzt aber vergleiche, weiterverarbeite oder überprüfe ob der wert drinsteht den ich will weiß ich ned ... vermutlich darf ich für dwNumber auch garkein array verwenden ... ka ... aber is vermutlich sowieso falsch was ich da mache ^^



  • Nimm doch einfach REG_BINARY, reserviere einen ausreichend großen char-Buffer (Theoretisch könntest du natürlich auch ein DWORD-Array nehmen, aber das macht das ganze eher unübersichtlich) und gib diesen an. Danach ist es nur noch eine Frage der Interpretation der Daten - Casten o.ä. (weiß ja nicht, was du auslesen willst)



  • naja ... das mit REG_BINARY habe ich ja versucht aber es hat nicht funktioniert ^^

    ich mach jetzt einfach

    BYTE dwNumber[BUFSIZE];   // Speicher für Registrywert
    DWORD dwData = BUFSIZE;   // Speicher für länge des Registrywerts
    BYTE dummy;               // Verglichsbyte für gesuchstes Byte im Registrywert
    dummy = 04;
    
    // usw. 
    
    readValueRet = RegQueryValueEx ( hKey3, "Wert", NULL, NULL, (BYTE*)&dwNumber, &dwData );  
    
     if (dwNumber[264] == dummy)
        gefunden++;
     else
        nichtGefunden++;
    

    und es funktioniert anscheinend so ... allerdings recht toll ist es nicht ^^

    ich habe ja nur nicht gewusst wie ich das was ich bekomme mit was anderem vergleiche ... ;/

    so und nun mus ich das ganze nur noch ordentlicher, intelligenter und besser machen ^^ ...



  • Was gefällt dir denn nicht?! Vergleichen must du aber alle Bytes deines Buffers, wenn du überprüfen willst, ob sie identlich sind 🙄



  • ja wenn mich alles interresiert schon 😃

    aber mich interresiert ja nur ob dieses eine byte 04 ist :p allerdings muss ich ja immer den kompletten registrie wert auslesen ^^

    und naja gefallen tut mir der gesamte code nicht ... das kann man sicher noch "ordentlicher" schreiben ... werd mir das jetzt am we nochmal anschauen ... irgendwie gehts sicher "besser"


Anmelden zum Antworten