Announcement

Collapse
No announcement yet.

Binärwert in Registry speichern DRINGEND

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

  • Binärwert in Registry speichern DRINGEND

    Wie kann ich den Binärwert 01 00 00 00 in der Registry speichern?
    Ich habe es mit folgendem Source versucht, was keinen Erfolg brachte.

    <font size="2" face="Arial">procedure TForm1.SpeedButton1Click(Sender: TObject);<br>
    var<br>
    reg : tregistry;<br>
    isize : integer;<br>
    sBuffer : string;<br>
    begin<br>
    reg := tregistry.create;<br>
    reg.RootKey:=HKEY_USERS;<br>
    reg.OpenKey<br>('.DEFAULT\Software\Microsoft\Windo ws\CurrentVersion\Policies\Explorer',false);<br>
    reg.writebinarydata('NoClose', sbuffer[2], 01000000);<br>
    reg.CloseKey;<br>
    reg.free;<br>
    end;</font>

    Wenn ich hinter sBuffer [1] eingebe, kommt eine Fehlermeldung.
    01000000 ergiebt eine ellenlange Binärzahl.

    warum?

  • #2
    Hallo Enrico,<br>
    <br>
    Binärzahlen werden als Integer geschrieben (WriteInteger).<br>
    Versuchs doch mal mit:<br>
    <br>
    var<br>
    R : TRegistry;<br>
    b : Integer;<br>
    begin<br>
    R := TRegistry.Create;<br>
    with R do begin<br>
    RootKey := HKEY_...;<br>
    OpenKey ('....', true);<br>
    b := $40;<br>
    WriteInteger ('test', b);<br>
    CloseKey;<br>
    end;<br>
    R.Free;<br>
    end;<br>
    <br>
    mfg Stefan Bitte

    Comment


    • #3
      Das hat mir leider nicht geholfen.<P>
      Wenn ich <B>b := $010000;</B> eingebe,<BR>
      wird in der Registry der Wert wie folgt angezeigt:<P>
      <B>0x00010000 (65536)</B><P>
      Der Wert soll aber so angezeigt werden: <B>01 00 00</B><P>
      <P><i>Wer kann mir helfen????</i></P></P></P></P></P&gt

      Comment


      • #4
        Hi Enrico,

        wenn ich das richtig übersehe ist der Inhalt von sbuffer in deinem Bsp. undefiniert (das ist die Ellenlange nämlich 1.000.000 Zeichen lang). WriteBinaryData erwartet drei Parameter, den Namen des Schlüssels ('NoClose'), die eigentlichen Daten (Inhalt von sbuffer -vorzugsweise als string) und die länge der Daten (1.000.000). Du mußt also in sbuffer deine Binärzahl (ich nehme mal an '1000000') und als 3.Parameter die Länge der Zahl (also 7). Zusammengefaßt:<br>
        sbuffer := '1000000';<br>
        WriteBinaryData('NoClose', sbuffer[1], 7);<br>

        Gruß Fal
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment


        • #5
          Das war wieder nicht das richtige.
          Wenn ich es so eingebe, erscheint in der registry folgender Eintrag:<P>
          NoClose 30 31 20 30 30 20 30<P>
          Es soll aber so angezeigt werden:<P>
          NoClose 01 00 00 00
          </P>
          </P>
          </P&gt

          Comment


          • #6
            reg.writebinarydata('NoClose', PChar(sbuffer)^, Length(sBufffer));

            Sollte in sBuffer = '010000' stehen, steht in Registry 31 30 30...

            <pre>

            var
            I: Integer;
            begin
            I := $010000;
            Reg.writebinarydata('NoClose', I, SizeOf(I));
            end;

            </pre>

            sollte Dein problem lösen

            Comment


            • #7
              Danke, Du hast mir sehr geholfen,<BR>
              woher wird jetzt die Länge der Zeichenfolge genommen?<P>
              Begin<BR>
              I := $01;<BR>
              reg := tregistry.create;<BR>
              reg.RootKey:=HKEY_USERS;<BR>
              reg.OpenKey<BR>('.DEFAULT\Software\Microsoft\Windo ws\CurrentVersion\Policies\Explorer',false);<BR>
              Reg.writebinarydata('NoSetFolder', I, SizeOf(I));<BR>
              reg.CloseKey;<BR>
              reg.free;<P>
              Wenn ich I := $010000 schreibe, steht die 01 nicht an erster Stelle, deshalb habe ich nur 01 geschrieben, Die Zeichenlänge bleibt jedoch bei 4 Zeichen paaren.</P></P&gt

              Comment


              • #8
                Hi

                ein Integer ist Sizeof(Integer) = 4 = 4 Bytes = 4x8Bits.
                Modifiziere
                <pre>

                WriteBinaryData(..,I, Größe in Bytes von I);
                z.B.
                WriteBinaryData(..,I,2); // 2 Bytes
                WriteBinaryData(..,I,3); // 3 Bytes

                </pre>

                Da SizeOf(Integer) = 4 können auch nur MAXIMAL 4 Bytes in einem Integer gespeichert werden.
                Ob nun aber 2,3,4 Bytes ist für einen Integer egal, bzw. ich würde IMMER 4 Bytes nehmen da ansonsten andere Probleme auftreten. Zudem stören 4 Bytes nicht und der Inhalt ist gleich. Egal ob 00 00 00 01 oder 00 01 oder 01 es bleibt bei I = 1;

                Dein Missverständniss entsteht dadurch das INTEL-CPU's eine LSB Darstellung eines Integers besitzen. Angenommen I := $01020304 dann wird in der registry $04030201 stehen, also die LSB First Methode.
                LSB = Last significant Byte/Bit, MSB = Most significant Byte/Bit,
                LSB = Little Endian Machine wie Intel-CPU, MSB = Big Endian Machine wie Motorola.

                Gruß Hage

                Comment


                • #9
                  Hallo,

                  das oben genannte Beispiel funktioniert ja bei 16 Stellen noch ganz gut, aber was muss ich tun um 42 Stellen in die Registry einzutragen?

                  Ich habe folgendendes probiert, bin aber noch zu keinen Ergebnis gekommen, da Int64 auch nicht so viele "Zeichen" unterstützt:

                  <pre>
                  var
                  Reg : TRegistry;
                  i : Int64;
                  begin
                  Reg:= TRegistry.create;
                  Reg.RootKey:= HKEY_LOCAL_MACHINE;

                  Reg.OpenKey ('System\CurrentControlSet\Services\VxD\Test',fals e);
                  i:= $48DCCF456E6D68411C71777A737774706F6B0C76;
                  Reg.WriteBinaryData ('Test',I, SizeOf(I));

                  Reg.CloseKey;
                  Reg.Free;
                  end;
                  </pre>

                  Tschüss..

                  Comment


                  • #10
                    Hi

                    <pre>

                    var
                    data: array[0..40] of Byte;

                    begin
                    .WriteBinary(Data, SizeOf(Data));
                    end;

                    </pre>

                    gruß Hage

                    Comment

                    Working...
                    X