Write Binary Data to Registry



  • Hi Allerseits!

    Ich versuche mit folgendem Quellcode ein kleines Bildchen in die Registry zu transferieren:

    void __fastcall TForm1::WriteBtnClick(TObject *Sender)
    {
         TRegistry *reg;
         TMemoryStream *m;
    
         reg = new TRegistry();
         m = new TMemoryStream();
    
         try
         {
            reg->RootKey = HKEY_LOCAL_MACHINE;
            reg->OpenKey("\\Software\\Test", true);
    
            Image1->Picture->Bitmap->SaveToStream(m);
    
            reg->WriteBinaryData("Image", &m, sizeof(m));
         }
         __finally
         {
                  delete reg;
                  delete m;
         }
    }
    
    void __fastcall TForm1::ReadBtnClick(TObject *Sender)
    {
         int i;
         TMemoryStream *m;
         TRegistry *reg;
    
         reg = new TRegistry();
         m = new TMemoryStream();
    
         reg->RootKey = HKEY_LOCAL_MACHINE;
         reg->OpenKey("\\Software\\Test", false);
    
         try
         {
            i = reg->ReadBinaryData("Image", &m, 0);
            m->SetSize(i);
    
            reg->ReadBinaryData("Image", &m, sizeof(m));
    
            m->Position = 0;
    
            Image1->Picture->Bitmap->LoadFromStream(m);
         }
         __finally
         {
                  delete m;
                  delete reg;
         }
    }
    

    Leider klappt das nicht ganz so wie ich will. Beim Schreiben werden nur 4 Bytes in die Registry geschrieben. Beim Lesen kommt dann: "Ungültiger Datentyp für 'TImage'". Hm. Volle Zugriffsrechte auf die Registry habe ich.

    Was läuft hier schief? 😕



  • Lass dir sizeof(m) mal zur Laufzeit ausgeben, sieh dir in der Hilfe nochmal genau an, was sizeof macht und versuch's dann stattdessen mit m-Size. 😉



  • Äh, ja. Ich habe jetzt alle sizeof(m) in m->Size geändert. Wenn ich nun mit dem Debugger durchteste hat m->Size den Wert '0' 😞 , obwohl ich ein Bild zugewiesen habe (welches ja auch zur Laufzeit im TImage angezeigt wird). Woran kann das nun wieder liegen, m->Size sollte doch irgendwas > '0' sein. Außerdem hat es nach dem SaveToStream die Höhe=0 und Breite=0 ?!



  • Ok. das Size Problem ist jetzt gelöst. Ich hatte statt einem BMP ein JPEG geladen, d.h. in Image1->Picture->Bitmap steht dann demzufolge nichts drin. Mit einem BMP ist die Size dann bei mir jetzt 374. Trotzdem er was in die Registry schreibt, kann ich es nicht zurücklesen.

    ReadBinaryData("Image", &m, 0);
    

    ^liefert dann immer noch "Ungültiger Datentyp für 'TImage'". 🙄



  • Prinzipfrage: Wozu schreibst du ein Bild in die Registry? Sie ist eigentlich nicht dafür gedacht, dass man sie mit bildern zumüllt...

    -junix



  • F98 schrieb:

    ... Image1->Picture->Bitmap ...

    Hi,
    ja um Format frei zu bleiben sollte man Image1->Picture->Graphic verwenden!

    MFG

    Alexander Sulfrian



  • junix schrieb:

    Prinzipfrage: Wozu schreibst du ein Bild in die Registry? Sie ist eigentlich nicht dafür gedacht, dass man sie mit bildern zumüllt...

    -junix

    Ist mir schon klar. Ich bin auf ein Delphi-Beispiel gestoßen wo Binärdaten in die Registry geschrieben werden. Das kann ja sein was will. Ich wollte es halt mal mir einem Bild probieren.

    Ich will das später auch mal dazu nutzen Programm-Keys in der Registry zu speichern.

    @Alexander Sulfrian

    Ok! Danke für den Hinweis.

    So, wie kann ich nun diese dumme Fehlermeldung "Ungültiger Datentyp für 'TImage'" umgehen? Warum funktioniert o.g. Code nicht so richtig?



  • Ist denn die Übertragung aus der Registry in den Stream erfolgreich? Stimmen Grösse und Inhalt des Streams mit dem Originalbild überein? Ggf. den Stream abspeichern und die Datei per Hexeditor mit dem Bild vergleichen.

    Ausserdem könntest du noch probieren, vor dem Laden aus dem Stream das PixelFormat des Ziel-Bitmaps zu setzen.



  • Jansen schrieb:

    Ist denn die Übertragung aus der Registry in den Stream erfolgreich?

    Ja. Läuft fehlerfrei.

    Stimmen Grösse und Inhalt des Streams mit dem Originalbild überein?

    Die Größe stimmt, dass was in der Registry ankömmt ist aber totaler Schrott. Bytes stimmen nicht überein. Nichtmal ein Offset ist erkennbar.

    Ausserdem könntest du noch probieren, vor dem Laden aus dem Stream das PixelFormat des Ziel-Bitmaps zu setzen.

    Dazu muß es erstmal richtig in die Registry gespeichert werden...



  • und er meckert wegen Bildvormat? -wenn das dein originaler Quellcode ist würde ich statt "Bitmap" mal "Bitmap.bmp" öffnen, und um sicher zu gehen nicht mit Image1->Picture->Bitmap->LoadFromFile(), sondern mit Image1->Picture->LoadFromFile();


Anmelden zum Antworten