Delphi-PRAXiS

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 12: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 12: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 13: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 13: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 13: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 13: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 13: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 13: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 15: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 15: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;

me2u 28. Aug 2006 16:04

Re: Problem bei WriteBinaryData und Pchar
 
man man man endlich geschafft

arbeite an HKEY_CURRENT_USER \SOFTWARE\Microsoft\Windows\CurrentVersion\Interne t Settings\Connections den Wert DefaultConnectionSettings
schon 1 1/2 tage.

Bis ich erst entschlüsselt hatte wie DefaultConnectionSettings ... omg :shock:

me2u 28. Aug 2006 23:59

Re: Problem bei WriteBinaryData und Pchar
 
also : habe die hexwerte fast komplett entschlüsselt :

Zeichenfolgen in byte
1.3c (muss immer da stehen)
2."00"(Hat nichts mit den Proxy zu tun, so ne art platzhalter)
3."00"(Hat nichts mit den Proxy zu tun, so ne art platzhalter)
4."00"(Hat nichts mit den Proxy zu tun, so ne art platzhalter)
5."xx"(Zähl um eins hoch, wenn man eine einstellung ändert)
6."xx"(Zähl um eins hoch, wenn man eine einstellungen 100mal ändert)
7."00"(Hat nichts mit den Proxy zu tun, so ne art platzhalter)
8."00"(Hat nichts mit den Proxy zu tun, so ne art platzhalter)
9."01"(bedeutet hier Proxy deaktiviert)"02"(bedeutet hier Proxy aktiviert)."03"(bedeutet hier auch Proxy aktiviert)
10."00"(Hat nichts mit den Proxy zu tun, so ne art platzhalter)
11."00"(Hat nichts mit den Proxy zu tun, so ne art platzhalter)
12."00"(Hat nichts mit den Proxy zu tun, so ne art platzhalter)
13."xx"(die länge der ip mit port (z.b. 80.80.80.80:8080) IM HEXFORMAT!!)
14."00"(Hat nichts mit den Proxy zu tun, so ne art platzhalter)
15."00"(Hat nichts mit den Proxy zu tun, so ne art platzhalter)
16."00"(Hat nichts mit den Proxy zu tun, so ne art platzhalter)
17."xx"(Teil der ip IM HEXFORMAT!! zb. "8")
18."xx"(Teil der ip IM HEXFORMAT!! zb. "0")
19."xx"(Teil der ip IM HEXFORMAT!! zb. ".")
20."xx"(Teil der ip IM HEXFORMAT!! zb. "8")
21."xx"(Teil der ip IM HEXFORMAT!! zb. "0")
22."xx"(Teil der ip IM HEXFORMAT!! zb. ".")
23."xx"(Teil der ip IM HEXFORMAT!! zb. "0")
24."xx"(Teil der ip IM HEXFORMAT!! zb. ".")
25."xx"(Teil der ip IM HEXFORMAT!! zb. "0")
26."xx"(Teil der ip IM HEXFORMAT!! zb. ":")
27."xx"(Teil der ip IM HEXFORMAT!! zb. "8")
28."xx"(Teil der ip IM HEXFORMAT!! zb. "0")
29."xx"(Teil der ip IM HEXFORMAT!! zb. "8")
30."xx"(Teil der ip IM HEXFORMAT!! zb. "0")
ab 30. kommt nochmal 36x "00"(Hat nichts mit den Proxy zu tun, so ne art platzhalter)

mehr hab ich bis jetzt noch nicht herrausfinden können.
wenn man dieses hexcode verändert werden die einstellungen zwart in das dialogfenster der ie einstellungen eingefügt aber nicht übernommen, d.h. man muss immer noch auf OK klicken.Habe noch nicht herrausgefunden wie man dies automatisch machen könnte.Bitte helft mir!!!

Christian Seehase 29. Aug 2006 00:12

Re: Problem bei WriteBinaryData und Pchar
 
Moin me2u,

ich denke mal, dass die Werte teilweise anders zu interpretieren sind (ohne Gewähr ;-))

1. bis 4., 5. bis 8., 9. bis 12. und 13. bis 16. sind mit Sicherheit nicht als einzelne Bytes zu betrachten, sondern jeweils als DWORD oder integer.
Beim Speichern werden die Bytes eines DWORD / integer umgedreht, so dass, z.B. aus 0000003C die Reihenfolge 3C000000 entsteht.
Deshalb dürfte auch 6. hochgezählt werden, wenn 5. überläuft (allerdings erst nach 255, nicht nach 100).

Der_Unwissende 29. Aug 2006 09:00

Re: Problem bei WriteBinaryData und Pchar
 
Zitat:

Zitat von me2u
mehr hab ich bis jetzt noch nicht herrausfinden können.
wenn man dieses hexcode verändert werden die einstellungen zwart in das dialogfenster der ie einstellungen eingefügt aber nicht übernommen, d.h. man muss immer noch auf OK klicken.Habe noch nicht herrausgefunden wie man dies automatisch machen könnte.Bitte helft mir!!!

Neue Frage -> Neuer Thread. Hier ist sogar die Motivation hoch da selbst drauf zu kommen. Kaum einer wird sehen, dass du hier noch eine offene Frage hast, die sich nicht mehr auf den ersten Teil (und Threadtitel) bezieht. Wenn du also einfach einen neuen Thread eröffnest, hast du sehr viel bessere Chancen dass dir jmd. hilft!
Aber dort natürlich auch nochmal kurz erklären was du wo machst :wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:07 Uhr.

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