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 DWORD aus Registry lesen... (https://www.delphipraxis.net/19096-dword-aus-registry-lesen.html)

S - tefano 29. Mär 2004 12:32


DWORD aus Registry lesen...
 
Hi,

so, ich bin hier in meinem Praktikumsbetrieb und soll Registrierungsschlüssel und -werte von einem Benutzerprofil zum nächsten übertragen.
Zur Verfügung steht mir Delphi3 auf WinNT.
Da nicht unbedingt ganze Schlüssel transferiert werden sollen, vermeide ich die hier bereits zurechtgebastelte Methode mit Load- und Savekey.
Also lese ich alle Values einzeln.
Jetzt habe ich nur ein Problem mit den DWORDs in der Registry.
Vor der Mittagspause habe ich es erstmal mit readInt und -Float versucht, da bekam ich aber eine Exception die mir sagte "Konnte Daten für 'ValueName' nicht holen".
Jetzt, nach der Pause ist die Exception weg, dafür aber eine neue die mir sagt dass ich den Wert in einen falschen Datentyp laden will.
Integer und die Gleitkommakollegen gehen also nicht.
Lasse ich mir mit GetDataType anzeigen was diese Value für einen Datentyp hat, kriege ich rdString zurück. In der Registry handelt es sich allerdings eben um einen DWORD.
Mit ReadString lässt sich das Ganze auch einlesen, nur bekomme ich anstatt
Zitat:

Zitat von Regedit4 - Exportdatei
dword:00000001

nur ein

Zitat:

Zitat von Mein Prog wenn ich es mit ReadString mache
1

geliefert.
Aber ich möchte den Wert ja schon gerne so auslesen, dass es in der Datei später so aussieht als hätte ich es aus dem Regedit exportiert. So kann ich mir ja quasi garantieren lassen dass beim späteren Import auf dem anderen Profil auch alles so läuft wie es soll.

Also wie gesagt, ich benutze Delphi3 auf WinNT und mache das Ganze mit der mitgelieferten TRegistry- Klasse mit ganz "normalem" VCL und kriege es nicht hin, einen DWORD so authentisch auszulesen dass es aussieht als hätte ihn das normale Regedit exportiert.

Danke schonmal für eure Hilfe,

S - tefano

[edit=Luckie]Quote-Tags gefixed. Mfg, Luckie[/edit]

MathiasSimmack 29. Mär 2004 12:42

Re: DWORD aus Registry lesen...
 
Hast du es schon mal spaßeshalber direkt über das API versucht?
Also mal ohne die TRegistry-Unit?

S - tefano 29. Mär 2004 13:43

Re: DWORD aus Registry lesen...
 
Hi,

ne, des hab ich noch nicht versucht.
Hmhmhm.
Werd mich mal durch die OH wühlen, vielleicht krieg ichs ja hin.
Weitere Vorschläge gern willkommen ;-)

Bis dann,

S - tefano

Luckie 29. Mär 2004 14:16

Re: DWORD aus Registry lesen...
 
Wie erstellst du eine Instanz von TRegistry?
Delphi-Quellcode:
reg := TRegistry.Create;
Öffnet die Registry immer mit KEY_ALL_ACCESS, also mit Lese- und Schreibrechten. Aber eventuell hast du keine Schreibrechte. Wenn du nur lesen willst, erstelle das TRegistry Objekt so:
Delphi-Quellcode:
reg := TRegistry.Create(KEY_READ);
Dann solltest du auch lesen können, wenn du keine Schreibrechte hast.

HKLM ist so ein Fall, da darf nur der Admin schreiben. Selbst ein Hauptbenutzer kann dort nicht schreiben.

S - tefano 29. Mär 2004 14:30

Re: DWORD aus Registry lesen...
 
Hi,

das mit dem KEY_READ habe ich schon versucht, aber scheinbar ist meine TRegistry-Version irgendwie zu alt oder so; bekomme nämlich dann einen Compiler-Fehler der mir sagt dass ich dem Konstruktor zu viele Parameter übergeben hab.
Ich versuche jetzt gerade erstmal per RegOpenKeyEx einen Schlüssel zu öffnen, leider klappt es nicht.
Entweder bekomme ich 2 zurückgeliefert -> File not found, oder ich bekomme 161 -> Bad path name

Wenn ich die 2 bekomme, sieht meine Zeile so aus:

Delphi-Quellcode:
RegOpenKeyEx(HKEY_CURRENT_USER, PChar('HKEY_CURRENT_USER\\Software\\Microsoft\\Office\\8.0\\Word\\Options\\'), 0, KEY_QUERY_VALUE, myHKEY);
Wobei myHKEY eine Variable vom Typ HKEY ist. Auch wenn ich anstatt doppelter Backslashes nur einfache '\' benutze bekomme ich die 2.

Die 161 bekomme ich, wenn ich

Delphi-Quellcode:
RegOpenKeyEx(HKEY_CURRENT_USER, PChar('\\Software\\Microsoft\\Office\\8.0\\Word\\Options'), 0, KEY_QUERY_VALUE, myHKEY);
mache, wobei es auch hier egal zu sein scheint ob ich jetzt zwei oder einen trennenden Backslash benutze.

Wo könnte da der Fehler liegen?
Soll ich dafür nen neuen Thread aufmachen oder gehts auch so?`

Bis dann,

S - tefano

Luckie 29. Mär 2004 14:32

Re: DWORD aus Registry lesen...
 
Was sollen denn die doppelten "\"? In Delphi letete ein "\" keine Escapesequenze ein.

S - tefano 29. Mär 2004 14:41

Re: DWORD aus Registry lesen...
 
Hi,

ich weiß, ich weiß ;-)
Nur wie schon gesagt hab ich es auch schon mit einzelnen '\' versucht, also nicht doppelt. Und das führt zum selben Ergebnis, daher hab ich mal ein bisschen rumprobiert.
Hab jetzt mal das PChar weggenommen, passiert dasselbe, und wenn ich die Securitymask von KEY_QUERY_VALUE auf KEY_READ umstelle zeigen sich auch keine Veränderungen.
Das was sich abzeichnet ist halt dass ich entweder Fehler 161 bekomme wenn ich den HKCU nicht angebe, und eine 2 wenn ich ihn dazuschreibe.

Ratlose Grüße,

S - tefano

S - tefano 29. Mär 2004 14:52

Re: DWORD aus Registry lesen...
 
ooooookay Kommando zurück:
Habs gelöst, undzwar hatte ich vorne einen Backslash drangelassen wenn ich den Rootkey aus dem String genommen hab.
Google hat mir eine VB-Beispielseite ausgespuckt, da haben die einfach den Subkey ohne eröffnenden und abschließenden '\' gemacht und einzelne '\' verwendet.
Hab ich glatt mal nachgemacht, und jetz gehts bei mir.
Juchu!!!
Dann werd ich mal langsam in den Feierabend gehen und morgen an dem RegQueryValue weitermachen.

Bis dann,

S - tefano

S - tefano 30. Mär 2004 11:43

Re: DWORD aus Registry lesen...
 
Hi,

ach übrigens:
Das mit dem DWORD kriege ich immernoch nicht hin.
Siehe mein anderer Post zum prinzipiellen Einsatz von RegQueryValueEx, das ist wo ich gerade bin.
Bislang kann ich damit aber nur Strings vernünftig auslesen.
Alles andere, int, dword (worum sich der Thread ja dreht), bool krieg ich nicht hin.
Wobei ich es mit bool auch noch nicht versucht hab.
AAAAAaaber:

Nehme ich als Puffer (siehe anderer Thread) nicht PChar sondern PDWORD (wenn ich einen DWORD auslesen will..... naja scheint mir am artverwandtesten zu sein), steht im Puffer was ganz wildes ($C1A908). Lasse ich es mir anzeigen, per

Delphi-Quellcode:
showmessage(inttostr(Integer(buf)));
dann steht eine 12691720 in der MessageBox.
Mache ich es mit einem @ vor dem buf, steht 1244688 in der Box.
Das passiert bei scheinbar jedem DWORD-Wert. Habe schon drei andere genommen die in der Registry unterschiedliche Werte haben, es kommen immer diese beiden Zahlen in die Box.

Was mache ich denn blos falsch?!
Gibts nicht vielleicht irgendeinen OLE-Container für Regedit damit ich den Schmarrn nicht selbst machen muss? Ist doch irgendwie doof, wenn jeder einzelne API-Befehl den ich zu dem Thema verwende erst nach 10 Stunden Rumknacken funktioniert...

Ergebensten Dank im Voraus für Eure weitere Hilfe,

S - tefano

MathiasSimmack 30. Mär 2004 12:17

Re: DWORD aus Registry lesen...
 
Mal als Beispiel. Einen anderen DWORD-Wert habe ich auf die Schnelle nicht gefunden:
Delphi-Quellcode:
  if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,
    'SOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explorer',
    0,KEY_READ,reg) = ERROR_SUCCESS) then
  try
    dwType := REG_NONE;
    dwLen := 0;
   
    // Zugriff auf den Wert klappte schon mal
    if(RegQueryValueEx(reg,'NoDriveTypeAutoRun',nil,@dwType,nil,
      @dwLen) = ERROR_SUCCESS) and
    // ist es ein DWORD
      (dwType = REG_DWORD) and
    // mit 4 Bytes Größe
      (dwLen = 4) then
    begin
      // dann noch mal,
      if(RegQueryValueEx(reg,'NoDriveTypeAutoRun',nil,
        @dwType,
        @dwValue, // <-- DWORD-Variable für den Wert
        @dwLen) <> ERROR_SUCCESS) then
      dwValue := 0;
    end;
  finally
    RegCloseKey(reg);
  end;
 
  ShowMessage(Format('Wert von "%s" = %d (%.8x)',
    ['NoDriveTypeAutoRun',dwValue,dwValue]));
Schau doch mal in die viel zitierten Win32-API-Tutorials von Luckie. Da gibt´s ein ganzes Kapitel zum Thema Registry.


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