Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Problem bei WriteBinaryData und Pchar (https://www.delphipraxis.net/75987-problem-bei-writebinarydata-und-pchar.html)

me2u 28. Aug 2006 11:34


Problem bei WriteBinaryData und Pchar
 
Hallo,

ich möchte in der Windows Registry unter HKEY_CURRENT_USER \SOFTWARE\Microsoft\Windows\CurrentVersion\Interne t Settings\Connections den Wert DefaultConnectionSettings ändern.

Er soll also so aussehen :3c00000001000000010000000000000000000000000000000 00000000000000000000000000000000000000000000000000 00000
wenn man den umwandelt bekomme ich :"<........................................" usw
das ist korrekt!

aber mit folgenen Code

Delphi-Quellcode:
var reg:tregistry;
s:string;
begin

        reg:=tregistry.Create;
        reg.RootKey:=HKEY_CURRENT_USER;
        REG.OpenKey('\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\Connections',true) ;
        // s setzen und umwandeln
          s:='3c000000010000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000';
        Reg.WriteBinaryData('DefaultConnectionSettings',pchar(s)^ , Length(s));
        reg.CloseKey;
        reg.Free;

end;
bekomme ich 33633030303030303031303030303030303130303030303030 30303030303030303030....uws
wenn man den umwandel bekomme ich :"3c0000000100000001000000000000000000000000000000 00000" usw
- also eigentlich dass, was ich wollte aber in der registry steht hald nur 3363303030303030303130

Der Fehler muss irgendwie bei PCHAR liegen - habe leider absolut keine Ahnung davon

Bitte helft!! :firejump:

Der_Unwissende 28. Aug 2006 11:41

Re: Problem bei WriteBinaryData und Pchar
 
Hi,
was meinst du denn was WriteBinaryData tut? Der Name sagt es doch, es werden die Daten binär geschrieben. Ein PChar ist nur ein Zeiger auf ein Array voller Character, das Nullterminiert ist. Anders gesagt hast du ein dyn. Byte Array, dessen ende durch chr('0') gekennzeichnet ist.
3 wäre als ASCII zeichen einfach die 33, c die 63 usw.
Wenn du die Stringrepräsentation schreiben möchtest, verwende einfach writeString!

Gruß Der Unwissende

[ADD]
Sorry, sehe erst jetzt was du eigentlich tun wolltest.
Ok, wenn du bytes schreiben möchtest, dann verwende einfach ein Byte Array. In der Uses Types (glaube ich) findest du TByteDynArray. Versuch es ungefähr so:

Delphi-Quellcode:
var buffer : TByteArray = ($3c, $00, $00, $00, $01, $00, ...);
...
  Reg.WriteBinaryData('DefaultConnectionSettings', buffer[0], Length(buffer));
[/Add]

me2u 28. Aug 2006 12:06

Re: Problem bei WriteBinaryData und Pchar
 
Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var reg:tregistry;
    buffer : TByteArray = ($3c, $00, $00, $00, $01, $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, 00, $0, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00);
begin
        reg:=tregistry.Create;
        reg.RootKey:=HKEY_CURRENT_USER;
        REG.OpenKey('\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\Connections',true) ;
        Reg.WriteBinaryData('DefaultConnectionSettings', buffer[0], Length(buffer));
        reg.CloseKey;
        reg.Free;
end;
Fehler:Cannot initialize local variables
So also ich arbeite zum ersten mal mit TByteArray...
Du hast irgendetwas von uses gesagt, muss ich da noch was definieren oder kommt vielleicht noch was unter type oder ein array of ?

SirThornberry 28. Aug 2006 12:08

Re: Problem bei WriteBinaryData und Pchar
 
Der fehler sagt ja schon alles. Lokale Variablen kann man nicht wie globale bei der definition initialisieren.

me2u 28. Aug 2006 12:10

Re: Problem bei WriteBinaryData und Pchar
 
ok gut! :-D aber jetzt is noch der fehler number of elements differs from declaration

Der_Unwissende 28. Aug 2006 12:17

Re: Problem bei WriteBinaryData und Pchar
 
Ok, sorry mein Fehler. Das geht nur wenn du die Länge des Arrays festlegst.
Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var reg:tregistry;
    buffer : Array[0..51] of Byte = ($3c, $00, $00, $00, $01, $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, 00, $0, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00);
begin
        reg:=tregistry.Create;
        reg.RootKey:=HKEY_CURRENT_USER;
        REG.OpenKey('\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\Connections',true) ;
        Reg.WriteBinaryData('DefaultConnectionSettings', buffer[0], Length(buffer));
        reg.CloseKey;
        reg.Free;
end;
Wenn ich mich nicht verzählt habe, sollte das so klappen.

me2u 28. Aug 2006 12:19

Re: Problem bei WriteBinaryData und Pchar
 
:-D :-D :-D Es waren 52 - aber es klappt !!! Danke danke !

bei 51 kommt komischerweise eine länge von 52 in der registrierung raus...

Der_Unwissende 28. Aug 2006 12:36

Re: Problem bei WriteBinaryData und Pchar
 
Das Array ist nullindiziert, 0..51 = 52 Werte. 1..51 wären dann die 51 :wink:
Da muss man immer aufpassen, aber du übergibst ja auch das Element an der Stelle [0].

me2u 28. Aug 2006 14:21

Re: Problem bei WriteBinaryData und Pchar
 
Liste der Anhänge anzeigen (Anzahl: 1)
so ich habe jetzt einen string den ich genauso wieder in der registrierung haben will, nur hald als binary data. Kann ihn aber vorher nicht definieren, weil die länge meines strings variiert.

3c00000001000000020000001100000038322e3133372e3235 322e3136323a38300000000000000000000000000000000000 00000000000000000000000000000000000000

sollte letztendlich also wie auf dem bild dann aussehen

Bild im Anhang

vielleicht irgendwie mit einem dynamischen array of byte und dann den string einlesen aber wie ???

[edit=sakura] Bild als Anhang. Mfg, sakura[/edit]

Der_Unwissende 28. Aug 2006 14:49

Re: Problem bei WriteBinaryData und Pchar
 
Da dein String sedizimale Werte enthält, solltest du einfach die Funktion HexToBin verweden.

Delphi-Quellcode:
var buffer : TByteDynArray;
begin
  // sei s der string den du umwandeln möchtest
  setLength(buffer, length(s) div 2);
 
  HexToBin(PChar(s), PChar(@buffer[0]), length(buffer));
 
  // jetzt stehen in Buffer die Byte Werte des Strings

  ....
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:00 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz