AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DWORD aus Registry lesen...

Ein Thema von S - tefano · begonnen am 29. Mär 2004 · letzter Beitrag vom 30. Mär 2004
Antwort Antwort
Benutzerbild von S - tefano
S - tefano

Registriert seit: 16. Dez 2002
Ort: Dülmen
477 Beiträge
 
Delphi 2009 Professional
 
#1

DWORD aus Registry lesen...

  Alt 29. Mär 2004, 12:32
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 von Regedit4 - Exportdatei:
dword:00000001
nur ein

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]
"Sir, we are surrounded!" - "Excellent, we can attack in every direction!"
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#2

Re: DWORD aus Registry lesen...

  Alt 29. Mär 2004, 12:42
Hast du es schon mal spaßeshalber direkt über das API versucht?
Also mal ohne die TRegistry-Unit?
  Mit Zitat antworten Zitat
Benutzerbild von S - tefano
S - tefano

Registriert seit: 16. Dez 2002
Ort: Dülmen
477 Beiträge
 
Delphi 2009 Professional
 
#3

Re: DWORD aus Registry lesen...

  Alt 29. Mär 2004, 13:43
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
"Sir, we are surrounded!" - "Excellent, we can attack in every direction!"
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: DWORD aus Registry lesen...

  Alt 29. Mär 2004, 14:16
Wie erstellst du eine Instanz von TRegistry?
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:
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von S - tefano
S - tefano

Registriert seit: 16. Dez 2002
Ort: Dülmen
477 Beiträge
 
Delphi 2009 Professional
 
#5

Re: DWORD aus Registry lesen...

  Alt 29. Mär 2004, 14:30
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:

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

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
"Sir, we are surrounded!" - "Excellent, we can attack in every direction!"
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: DWORD aus Registry lesen...

  Alt 29. Mär 2004, 14:32
Was sollen denn die doppelten "\"? In Delphi letete ein "\" keine Escapesequenze ein.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von S - tefano
S - tefano

Registriert seit: 16. Dez 2002
Ort: Dülmen
477 Beiträge
 
Delphi 2009 Professional
 
#7

Re: DWORD aus Registry lesen...

  Alt 29. Mär 2004, 14:41
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
"Sir, we are surrounded!" - "Excellent, we can attack in every direction!"
  Mit Zitat antworten Zitat
Benutzerbild von S - tefano
S - tefano

Registriert seit: 16. Dez 2002
Ort: Dülmen
477 Beiträge
 
Delphi 2009 Professional
 
#8

Re: DWORD aus Registry lesen...

  Alt 29. Mär 2004, 14:52
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
"Sir, we are surrounded!" - "Excellent, we can attack in every direction!"
  Mit Zitat antworten Zitat
Benutzerbild von S - tefano
S - tefano

Registriert seit: 16. Dez 2002
Ort: Dülmen
477 Beiträge
 
Delphi 2009 Professional
 
#9

Re: DWORD aus Registry lesen...

  Alt 30. Mär 2004, 11:43
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

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
"Sir, we are surrounded!" - "Excellent, we can attack in every direction!"
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#10

Re: DWORD aus Registry lesen...

  Alt 30. Mär 2004, 12:17
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:01 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