Entwickler-Ecke

Windows API - DWORD-Werte aus Registry lesen


Dargor - Fr 31.01.03 18:36
Titel: DWORD-Werte aus Registry lesen
Wie kann ich DWORD-Werte (bzw. REG_DWORD-Werte) mit Hilfe von TRegistry auslesen und schreiben? Afaik ist DWORD ein Integer-Typ und müßte daher eingentlich mit ReadInteger zu lesen/WriteInteger zu schreiben sein.

Aber ich bekomme nur eine Exception:
Zitat:
Project Project1.exe raised an exception class ERegistryException with message 'Invalid data type for 'value''.


Delete - Fr 31.01.03 20:10

Wirklich? Ist mir noch nie aufgefallen, und ich habe nun wirklich schon oft DWORDs gelesen und geschrieben. Bist du 100% sicher, dass der Fehler daran liegt?

Ansonsten, versuch´s mal mit "RegBinaryData" und gib als Puffer deine DWORD-Variable und ihre Größe an:

Quelltext
1:
RegBinaryData('bla bla',dwWert,sizeof(DWORD));                    


Yepp! Ich habe gerade mal in einem Programm nachgeschaut.
Ich benutze zwar Integer als Typ, aber die werden als DWORD in der Registry abgelegt.


Dargor - So 02.02.03 04:38

Bin sogar ziemlich sicher ;)
Bin dabei ein kleines Proggy zu coden, mit dem man versteckte Optionen unter WinXP aktivieren kann, so z.B. unter
Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced den Wert EnableBalloonTips und der ist ein REG_DWORD
Ich werde es aber mal mit ReadBinaryData versuchen.


Delete - So 02.02.03 18:45

Ich hoffe, du gestaltest dein Programm so, dass der User vorher wenigstens gefragt wird. ´s gibt einige WinXP-User, die genau diesen EnableBalloonTips-Wert mit XP-AntiSpy abgestellt haben. Die wären bestimmt nicht begeistert, wenn dein Programm das wieder einstellt. :twisted:

Wenn´s mit RegBinaryData nicht geht, dann benutze zum Einlesen (ReadInteger) doch mal eine Integer-Variable anstelle eines DWORD. Eins und Null bekommst du damit auch hin.


Delete - So 02.02.03 19:03

Gerade ausprobiert mit Delphi 5:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
uses
  Registry;

var
  reg    : TRegistry;
  dwTest : DWORD;

procedure TForm1.Button1Click(Sender: TObject);
begin
  reg := TRegistry.Create;
  with reg do try
    if(OpenKey('Software\Mathias\DWORD-Test',true)) then begin
      dwTest := 123;
      WriteInteger('Test',dwTest);

      CloseKey;
    end;
  finally
    Free;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  reg := TRegistry.Create(KEY_READ);
  with reg do try
    if(OpenKey('Software\Mathias\DWORD-Test',false)) then begin
      dwTest := ReadInteger('Test');
      ShowMessage(inttostr(dwTest));

      CloseKey;
    end;
  finally
    Free;
  end;
end;

Null Fehler, Null Warnungen, keine Exceptions!

Ich dachte nämlich: vielleicht liegt es an der Option "bei Delphi-Exceptions stoppen"
(Tools/Debugger-Optionen/Sprach-Exceptions). Aber selbst als ich das eingeschaltet habe, kam kein Fehler. Also, irgendwas machst du falsch. :wink: