Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi ReadBinaryData() - Problem (https://www.delphipraxis.net/39832-readbinarydata-problem.html)

peicher 8. Feb 2005 09:29


ReadBinaryData() - Problem
 
Morgen zusammen,

Ich will Daten aus der Registry mit Hilfe der Methode ReadBinaryData() auslesen.

Folgendermaßen rufe ich diese auf:
Delphi-Quellcode:
Registry.ReadBinaryData('EDID', Info, 128);
'EDID' Verweist auf den Wert in der Registry, der ist vom Typ "REG_BINARY". Info ist eine Struktur (EDID-Header für Monitorinformationen), welche die Daten erhalten soll. Es sollen auch nur 128 Bytes dahin kopiert werden.

Soweit so gut.

Beim Aufruf kommt eine ERegistryException:
"Ungültiger Datentyp für 'EDID'"

Ist hiermit gemeint, dass der Wert in der Registry den falschen Datentyp oder evtl. die Struktur in welche die Daten letztendlich sollen, vom falschen Typ sind?

Ich höffe jemand kann mit wieterhelfen.

Vielen Dank schonmal.

Gruß,
Philipp

peicher 8. Feb 2005 12:35

Re: ReadBinaryData() - Problem
 
Hat denn niemand ne Idee?

shmia 8. Feb 2005 13:23

Re: ReadBinaryData() - Problem
 
Zitat:

Zitat von peicher
Morgen zusammen,

Ich will Daten aus der Registry mit Hilfe der Methode ReadBinaryData() auslesen.

Folgendermaßen rufe ich diese auf:
Delphi-Quellcode:
Registry.ReadBinaryData('EDID', Info, 128);
'EDID' Verweist auf den Wert in der Registry, der ist vom Typ "REG_BINARY". Info ist eine Struktur (EDID-Header für Monitorinformationen), welche die Daten erhalten soll. Es sollen auch nur 128 Bytes dahin kopiert werden.

Soweit so gut.

Beim Aufruf kommt eine ERegistryException:
"Ungültiger Datentyp für 'EDID'"

Ist hiermit gemeint, dass der Wert in der Registry den falschen Datentyp oder evtl. die Struktur in welche die Daten letztendlich sollen, vom falschen Typ sind?

Nach deiner Fehlermeldung muss ich bezweifeln, das der Key 'EDID' wirklich vom Typ "REG_BINARY" ist.
Deshalb:
Delphi-Quellcode:
if Registry.GetDataType('EDID') <> rdBinary then
   Raise Exception.CreateFmt('Registry-Key %s ist nicht binär!', ['EDID']);

// sicherheitsprüfung
if sizeof(info) < 128 then
   raise Exception.Create('UPS! Info Struktur zu klein!');

Registry.ReadBinaryData('EDID', Info, 128);

peicher 8. Feb 2005 13:31

Re: ReadBinaryData() - Problem
 
Hallo shmia,
Danke für deine Antwort!

Leider wird keine der beiden Exceptions ausgelöst, d.h. der Typ muss Binary sein und die Info-Struktur ist auch nicht zu klein...

Wenn ich im Regedit nachschaue, dann steht da schon "REG_BINARY" als Datentyp.

Sonst noch irgendwelche Ideen, bzw. Einfälle?

shmia 9. Feb 2005 09:10

Re: ReadBinaryData() - Problem
 
Zitat:

Zitat von peicher
Leider wird keine der beiden Exceptions ausgelöst, d.h. der Typ muss Binary sein und die Info-Struktur ist auch nicht zu klein...
Wenn ich im Regedit nachschaue, dann steht da schon "REG_BINARY" als Datentyp.
Sonst noch irgendwelche Ideen, bzw. Einfälle?

Seltsam, dass dein TRegistry Objekt den Namen "Registry" trägt; dies müsste eigenlich zu einem
Namenskonflikt mit der Unit registry.pas führen. :gruebel:

Kopiere doch mal die Unit registry.pas in das Verzeichnis mit deinem Sourcecode und füge die Unit
zum Projekt hinzu.
Danach kannst du einen Breakpoint setzen und in die Funktion ReadBinaryData hineindebuggen.
Delphi-Quellcode:
resourcestring
  SInvalidRegType = 'Ungültiger Datentyp für ''%s''';
procedure ReadError(const Name: string);
begin
  raise ERegistryException.CreateResFmt(@SInvalidRegType, [Name]);
end;

function TRegistry.ReadBinaryData(const Name: string; var Buffer; BufSize: Integer): Integer;
var
  RegData: TRegDataType;
  Info: TRegDataInfo;
begin
  if GetDataInfo(Name, Info) then
  begin
    Result := Info.DataSize;
    RegData := Info.RegData;
    if ((RegData = rdBinary) or (RegData = rdUnknown)) and (Result <= BufSize) then
      GetData(Name, @Buffer, Result, RegData)
    else ReadError(Name); // <=== hier wird dein Code wohl drauflaufen
  end else
    Result := 0;
end;
Also ich vermute jetzt: die Daten in dem Registry-Key sind länger als 128 Bytes. :idea:
Dann wird die irreführende Meldung 'Ungültiger Datentyp für ''%s''' erzeugt.

Tyrael Y. 2. Feb 2006 14:34

Re: ReadBinaryData() - Problem
 
...sry, daß ich das rauskrame, aber vielleicht hilft es ja einem anderem

Deine Struktur "Info" ist falsch.
Füge am Ende ein
Delphi-Quellcode:
  Reserved: array[1..128] of Byte;
ein.

Danach so aus der Registry lesen.

Delphi-Quellcode:
  Registry.ReadBinaryData('EDID', Info, SizeOf(Info));

...das liegt daran, daß es verschiedene EDID Strukturen gibt Version 1.0 bis 3.0 glaub ich.

1.0 war noch 128 Byte groß
danach irgenwann 256 Byte, deshalb am Ende noch 128 Byte dazu, dann liegts du immer richtig.


Gruß
Tyrael


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:18 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