Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi [TRegistry, D3] "Ungültiger Datentyp" (https://www.delphipraxis.net/25146-%5Btregistry-d3%5D-ungueltiger-datentyp.html)

Tommi 1. Jul 2004 20:38


[TRegistry, D3] "Ungültiger Datentyp"
 
Hi,

ich hab ein Problem mit dem Auslesen eines binären Registrywerts mit der Methode ReadBinaryData (unter Delphi 3, Win 2000). Ich weiß durch Blick in regedit, daß der betreffende Wert (eingerichtet von einer WLAN-Karten-Treibersoftware), vom Typ REG_BINARY ist, aber während der Laufzeit erhalte ich die Fehlermeldung "Ungültiger Datentyp für 'Profile0'" - wobei Profile0 der betreffende, binäre Wert wäre.
Ich bin auf jeden Fall im richtigen Key, hab auch das richtige Root-Key gesetzt. Und ein anderer binärer Wert im selben Key läßt sich aus irgendeinem Grund auslesen, nur nicht Profile0.

Habt ihr eine Ahnung, woran das liegen könnte?

Danke im Voraus

Christian Seehase 1. Jul 2004 20:44

Re: [TRegistry, D3] "Ungültiger Datentyp"
 
Moin Tommi,

vielleicht könntest Du ja mal zeigen, wie Du es machst.

Tommi 1. Jul 2004 20:48

Re: [TRegistry, D3] "Ungültiger Datentyp"
 
Code:
procedure LoadProfile0;
var reg : TRegistry;
    size : integer;
Begin
     reg := TRegistry.Create;
     reg.RootKey := HKEY_LOCAL_MACHINE;
     Profile0 := StringOfChar(#00,177);
     If reg.OpenKey ( device_key, false ) Then
     Begin
          Form1.StaticText1.Caption := Form1.StaticText1.Caption + device_key;
          reg.ReadBinaryData('Profile0', Profile0[1], 177 );
          Form1.StaticText3.Caption := Profile0;
     End;
     reg.CloseKey;
     reg.free;
End;
Ich weiß, es ist "quick'n'dirty" ohne Fehlerkontrolle, aber ich will mir eh nur ein Tool für den Heimgebrauch basteln.

device_key ist der Schlüssel mitsamt Pfad zum WLAN-Eintrag (Marke Realtek), welcher zuvor in einer anderen Prozedur ermittelt wird. Sinn und Zweck des Programms soll das automatische Abändern des WEP-Passphrases sein, um das WLAN ein bissl sicherer zu machen...


EDIT: die Variable Profile0 ist global vom Typ string...

Christian Seehase 1. Jul 2004 21:39

Re: [TRegistry, D3] "Ungültiger Datentyp"
 
Moin Tommi,

probier das hier mal aus:

Delphi-Quellcode:
var
  hRootKey : HKEY;
  dwType  : DWORD;

begin
  if RegOpenKey(HKEY_LOCAL_MACHINE,PChar(device_key),hRootKey) <> ERROR_SUCCESS then exit;
  try
    if RegQueryValueEx(hRootKey,'Profile0',nil,@dwType,nil,nil) <> ERROR_SUCCESS then exit;
    ShowMessage(IntToStr(dwType));
  finally
    RegCloseKey(hRootKey);
  end;
end;
es gibt nämlich noch ein paar Registry Datentypen, die das Icon vom Typ binary haben, aber nicht vom Typ binary sind.
Zumindest habe ich so den Verdacht, dass D3 den Typ einfach nicht als solchen erkennt.

Ich hoffe mal, dass D3 die beiden Funktionen so implementiert, dass Du sie so 1:1 benutzen kannst.

Tommi 1. Jul 2004 21:46

Re: [TRegistry, D3] "Ungültiger Datentyp"
 
Hmm... Vielen Danke für den Code. Das Ergebnis zeigt mir eine "3" an... ein Blick in die Delphi-Hilfe weist darauf hin, daß der Eintrag also vom Typ "REG_EXPAND_SZ" wär... somit eine Art String, aber wie greif ich nun darauf zu? :gruebel:

Christian Seehase 1. Jul 2004 21:52

Re: [TRegistry, D3] "Ungültiger Datentyp"
 
Moin Tommi,

ein Blick in die Windows Header sagt da etwas anderes:
REG_BINARY = 3

:gruebel:

Stellt sich die Frage, wieso Delphi jetzt meckert... sollte doch so sein.

Wenn Du bei RegQueryValueEx die letzten beiden Parameter verwendest, kannst Du damit den Wert auslesen ;-)
Der Einfachheit halber habe ich mir das hier nur gespart, da die Funktion auch ohne Abfrage des Wertes funktioniert.

Tommi 1. Jul 2004 21:56

Re: [TRegistry, D3] "Ungültiger Datentyp"
 
Hehe :oops: hab ich mich doch glatt in der Zeile geirrt...

Noch eine hoffentlich letzte Frage zum Abschluß - wie kann ich diesen Wert wiederum setzen?

Danke!

Christian Seehase 1. Jul 2004 22:08

Re: [TRegistry, D3] "Ungültiger Datentyp"
 
Moin Tommi,

sollte eigentlich so gehen:
Ändere den ausgelesenen Wert wie gewünscht, und dann kannst Du die Parameter von RegQueryValueEx so in RegSetValueEx übernehmen (falls mir die Borland Deklaration da keinen Strich durch die Rechnung macht ;-) )

mal im Groben

Delphi-Quellcode:
var
  pData : PByte;
  dwSize : DWORD;
 
//...
  RegSetValueEx(hRootKey,'Profile0',0,dwType,pData,dwSize);
Vorausgesetzt, Du liest auch mit RegQueryValueEx den Wert aus, versteht sich.

Vor dem Anwenden von solchen schreibenden Funktionen auf die Registry:
Prüfen, ob sie auch wirklich tun, was sie sollen, oder ein Testsystem nehmen.
Ansonsten ist u.U. eine Neuinstallation fällig.

Tommi 1. Jul 2004 22:21

Re: [TRegistry, D3] "Ungültiger Datentyp"
 
Oha... Danke für die Warnung... :pale:

Ich muß mal schaun, weil aus irgendeinem Grund "RegQueryValueEx" nicht in den String "Profile0" reinschreiben will

Code:
RegQueryValueEx(hRootKey,'Profile0',nil,@dwType,@Profile0[1], pSize)
wobei pSize ein Zeiger auf Size : DWord ist... die If-Abfrage sorgt jedenfalls, Deinem Code entsprechend, für einen Abbruch und der String scheint leer zu sein... :?

Tommi 1. Jul 2004 22:26

Re: [TRegistry, D3] "Ungültiger Datentyp"
 
Okay... habs schon rausgekriegt... es soll heißen

Code:
RegQueryValueEx(hRootKey,'Profile0',nil,@dwType,PByte(Profile0[1]), pSize)
:mrgreen:


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

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