| Autor |
Beitrag |
Flox03
Hält's aus hier
Beiträge: 5
|
Verfasst: Mo 05.05.03 12:30
Hallo!
Ich benutze in meinem Programm u.a. die TRegistry Methode OpenKey('Mein Key',false)
Das funktioniert auch alles einwandfrei  , auch auf anderen Rechnern mit Win 98. Wenn der key existiert liefert die Funktion true zurück andernfalls false. Wenn der Schlüssel da ist, lese ich die einzelnen Werte ein.
Habe jetzt aber mein Programm auf einem Win 95 Rechner installiert und mit erschrecken festgestellt, dass die Abfrage If not OpenKey('Mein Key',false) immer false ist, selbst dann, wenn der Schlüssel existiert.
Habe deshalb ein kl. registry-test-prog geschrieben und festgestellt, dass die TRegistry-funktionen
KeyExists
OpenKey('',false)
OpenKeyReadOnly
unter Win95 immer  fehlschlagen, auch wenn der Schlüssel da ist. Nur OpenKey('',true) scheint zu funktionieren.
Ist das normal? Kann das sein? Ich meine, wozu gibts unter Win 95 ne Registry, wenn man auf diese nicht einwandfrei zugreifen kann??
Gibts andere Möglichkeiten auf die Registry zuzugreifen?? Gibt es evtl. einen Grund, warum die Funktionen dort nich funktionieren, den man leicht beheben kann???
Bin da echt am verzweifeln. Das arbeiten mit der Registry muss doch irgendwie möglich sein.
MfG,
Flox03!
|
|
Teutobod
      
Beiträge: 55
|
Verfasst: Mo 05.05.03 12:57
Quelltext 1:
| If not OpenKey('Mein Key',false) |
gibt natürlich false zurück. Denn was passiert:
OpenKey hat als Rückgabewert nen Bool. Gibt es den Reg-Eintrag kommt ein true zurück, ansonsten ein false.
Da du mit dem zweiten Parameter angibst, daß der Schlüssel nicht erstellt werden darf wenn er nicht existiert, gibt die function ein false zurück wenn er nicht vorhanden ist.
Vielleicht solltest du für den Anfang bei
Quelltext 1:
| If OpenKey('Mein Key',false) = true then |
bleiben.
Ich glaube, daß der Fehler bei dir liegt.
mfg Teutobod
|
|
Flox03 
Hält's aus hier
Beiträge: 5
|
Verfasst: Mo 05.05.03 14:21
| Zitat: | | Da du mit dem zweiten Parameter angibst, daß der Schlüssel nicht erstellt werden darf wenn er nicht existiert, gibt die function ein false zurück wenn er nicht vorhanden ist |
ist klar, logisch, nur er gibt eben unter Win 95 auch false zurück, wenn er da ist.
Noch genauere Erklärung:
Mein Install Programm benutzt CreateKey... danach ist der Schlüssel da, unter Win 98 sowie unter Win 95.
Wenn man dann das eigentliche Prog startet, wird in form.create meine function loadregistry aufgerufen:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| function load_registry:boolean; var reg:TRegistry; begin reg:=TRegistry.Create; reg.RootKey:=HKEY_LOCAL_MACHINE; if not reg.OpenKey('SOFTWARE\MyCompany\MYProduct\',false)then begin reg.Free; result:=false; end else begin result:=true; {hier werden die werte geladen.} reg.Free end; end; |
Hier der Aufruf aus Form.create:
Quelltext 1: 2: 3: 4: 5: 6: 7:
| {...} if not load_registry then begin MessageBox(WindowHandle,'Fehler beim lesen der Registry-Schlüssel.'+#13+ 'Stellen Sie sicher dass das Programm ordnungsgemäß installiert wurde.', 'Fehler!',MB_ICONEXCLAMATION or MB_OK); {...} |
Das hat aber als Ergebnis:
Win 95: MessagBox wird angezeigt, auch wenn Schlüsse da ist ----> loadregisty=false;
Win 98: alles läuft einwandrei.
genauso schlägt unter Win 95 (wie oben schon geschrieben)
openKeyReadOnly
KeyExists
immer fehl, auch wenn der Schlüssel 100%ig da ist.
Ich verstehs nicht...
Wie gesagt, läuft auf mehreren Win 98 Rechnern einwandfrei...
...nur das dumme ist, grade auf dem Win 95 Rechner MUSS es laufen.
|
|
Teutobod
      
Beiträge: 55
|
Verfasst: Mo 05.05.03 15:07
Ich hab trotz längerem googlen nichts gefunden, was aussagt, daß die openkey function nicht unter win95 korrekt funktioniert.
Vielleicht hat noch irgendjemand win95 der das testen könnte? Ich habs nicht mehr 
|
|
bis11
      
Beiträge: 1247
Erhaltene Danke: 2
Apple Mac OSX 10.11
|
Verfasst: Di 06.05.03 07:49
Ändere mal diesen Code :
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| function load_registry:boolean; var reg:TRegistry; begin reg:=TRegistry.Create; reg.RootKey:=HKEY_LOCAL_MACHINE; if not reg.OpenKey('SOFTWARE\MyCompany\MYProduct\',false)then begin reg.Free; result:=false; end else begin result:=true; {hier werden die werte geladen.} reg.Free end; end; |
so ab :
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| function load_registry:boolean; var reg:TRegistry; begin reg:=TRegistry.Create; reg.RootKey:=HKEY_LOCAL_MACHINE; if reg.OpenKey('SOFTWARE\MyCompany\MYProduct\',false)then begin // Das "not" entfernt reg.Free; result:=false; end else begin result:=true; {hier werden die werte geladen.} reg.Free end; end; |
Das not prüft in der IF-Schleife ab ob der Wert ein false zurückbringt. Ist das der Fall, dann geht er in den ersten Teil der Schleife. Gibt die Überprüfung ein True zurück, dann geht er in den ELSE-Teil der Schleife
|
|
Teutobod
      
Beiträge: 55
|
Verfasst: Di 06.05.03 08:20
| Zitat: | | Das not prüft in der IF-Schleife ab ob der Wert ein false zurückbringt. Ist das der Fall, dann geht er in den ersten Teil der Schleife. Gibt die Überprüfung ein True zurück, dann geht er in den ELSE-Teil der Schleife |
Ich kann mir vorstellen, daß er das erreichen will : wenn der key existiert in den else - Teil und wenn er nicht existiert freen.
So wie du es schreibst setzt du die reg-var frei wenn der schlüssel existiert.
Ich glaube sowieso, daß der fehler nichts mir delphi und win95 zu tun hat.
|
|
Teutobod
      
Beiträge: 55
|
Verfasst: Di 06.05.03 11:37
flox03: Ich hab mir win95 in einer virtual machine aufgesetzt und das mit OpenKey ausprobiert. Es geht wirklich nicht. 
|
|
Flox03 
Hält's aus hier
Beiträge: 5
|
Verfasst: Di 06.05.03 12:08
Danke, dass du dir die Mühe gemacht hast, das zu testen @Teutobod!!
| Zitat: | | Es geht wirklich nicht. |
Jetzt weiß ich wenigstens, dass es höchstwarscheinlich an Win 95 liegt und nicht an mir und/oder diesen einem System...
Für alle die auch unter Win 95 mit der registry arbeiten wollen und die Methoden von TRegistry nutzen möchten...
- CreateKey
- Openkey('',true)
- ValueExists
- alle Read..
- alle Write..
scheinen zu funktionieren...
DeleteKey und DeleteValue noch nicht sicher geprüft...
- KeyExists
- OpenKeyReadOnly
- OpenKey('',false)
gehen definitiv NICHT!!!
Man müsste dann mit OpenKey('',true) --> ValueExists --> Read... arbeiten.
Ist dann aber dumm, da immer ein Schlüssel erstellt wird, auch wenn er gar nicht erstellt werden soll... Außerdem ist ein sicheres Abfragen eines Schlüssels so nicht wirklich möglich.
Deshalb und um auf Nummer sicher zu gehen, bin ich grad dabei mein Programm von den TRegistry-mist zu befreien und versuche stattdessen die WinAPI-Funktionen RegOpenKeyEx, RegQueryValueEx, usw. einzubauen. Die sollten ja eigentlich auch unter Win 95 korrekt arbeiten?!?!!
Ist nur ein wenig kompliziert das ganze... *gg*
MfG,
Flox03!
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 06.05.03 17:14
| Flox03 hat folgendes geschrieben: | | Deshalb und um auf Nummer sicher zu gehen, bin ich grad dabei mein Programm von den TRegistry-mist zu befreien und versuche stattdessen die WinAPI-Funktionen RegOpenKeyEx, RegQueryValueEx, usw. einzubauen. Die sollten ja eigentlich auch unter Win 95 korrekt arbeiten?!?!! |
Wirf mal einen Blick in die Registry-Unit. Dann wirst du feststellen, dass hinter diesem so genannten "TRegistry-Mist" die WinAPI-Funktionen stecken.
| Zitat: | | Ist nur ein wenig kompliziert das ganze... *gg* |
Ob sich der Aufwand lohnt, kann man nicht sagen. Wenn du mit der VCL arbeitest, dann lohnt es IMHO nicht, auf die TRegistry zu verzichten. Die nimmt einem jede Menge Arbeit ab. Der Weg über die API ist aufwändiger, das stimmt schon.
Übrigens fällt mir da ein Satz ein:
| Zitat: | | Und was ist mit dem Ressourcenschutz? |
Will sagen: deine Funktion könnte ein bisschen abgesichert werden. Ich würde es mit TRegistry so machen
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| function load_registry: boolean; var reg : TRegistry; begin Result := false;
reg :=TRegistry.Create(KEY_READ); with reg do try RootKey := HKEY_LOCAL_MACHINE; if(OpenKey('Software\MyCompany\MyProduct',false)) then begin { hier werden die Werte geladen }
Result := true; CloseKey; end; finally Free; end; end; |
Und ohne so
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: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48:
| function load_registry: boolean; var reg : HKEY; lpType, cbData : dword; dwTest : dword; szTest : string; begin Result := false;
if(RegOpenKeyEx(0,'Software\MyCompany\MyProduct', 0,KEY_READ,reg) = ERROR_SUCCESS) then try // hier können jetzt die Werte geladen werden // als Beispiel, ein DWORD-Eintrag lpType := REG_NONE; cbData := 0;
if(RegQueryValueEx(reg,'DWORD-Testwert',nil, @lpType,nil,@cbData) = ERROR_SUCCESS) and (lpType = REG_DWORD) and (cbData = 4) then begin Result := RegQueryValueEx(reg,'DWORD-Testwert', nil,@lpType,@dwTest,@cbData) = ERROR_SUCCESS; end;
// und vielleicht noch einen String auslesen lpType := REG_NONE; cbData := 0; SetLength(szTest,0);
if(RegQueryValueEx(reg,'String-Testwert',nil, @lpType,nil,@cbData) = ERROR_SUCCESS) and (lpType in[REG_SZ,REG_EXPAND_SZ]) and (cbData > 0) then begin SetLength(szTest,cbData); Result := RegQueryValueEx(reg,'String-Testwert', nil,@lpType,@szTest[1],@cbData) = ERROR_SUCCESS;
if(Result) then SetLength(szTest,cbData-1); end; finally RegCloseKey(reg); end; end; |
<-- Edit -------------------- >
Upps, das muss natürlich
Quelltext 1: 2: 3:
| if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, // <-- 'Software\MyCompany\MyProduct', 0,KEY_READ,reg) = ERROR_SUCCESS) then |
in der API-Variante heißen, sonst wird das nichts. 
|
|
Flox03 
Hält's aus hier
Beiträge: 5
|
Verfasst: Di 06.05.03 20:46
Danke für den Code!!
Die WinAPI Funktionen verbrauchen halt ein paar Zeilen mehr und sind umständlicher anzuwenden...
Habe das Lesen der Werte aus dem Schlüssel aber schon vorher mit Hilfe des WinSDKs und deinem Tutorial hinbekommen... *g* Ist übriegens ganz gut gemacht, das Tutorial!
Bin ja mal gespannt, ob wenigstens das auf Win95 läuft. Mich wundert jetzt gar nichts mehr...
Eins würd mich aber noch intressieren:
| Zitat: | | Dann wirst du feststellen, dass hinter diesem so genannten "TRegistry-Mist" die WinAPI-Funktionen stecken |
Naja, das war mir irgendwie schon klar, aber irgendwas müssen die ja noch zusätzlich oder anders machen, sonst würde es ja unter Win 95 keine Probleme geben...
Habe mir grad so spontan überlegt, dass komischerweise nur die Methoden nicht gehen, die den Access auf KEY_READ stellen...
Zumindest nehme ich mal an, dass OpenKeyReadOnly das macht, habe die Units leider nicht als .pas.
Vielleicht mag das Win 95 nicht, weil OpenKey('',true) z.B. müsste den Access auf KEY_WRITE stellen (rein logisch betrachtet), oder KEY_ALL_ACCESS - und das funktioniert dann ja auch einwandfrei.
Im Gegensatz zu Openkey('',false)...
Sollte man mal testen...
Mich wundert auf jedenfall noch, dass das niemanden früher aufgefallen ist... Das Object/die Klasse TRegistry wird es ja mit Sicherheit schon recht lange geben, - und früher war ja Win 95 auch noch zahlreicher vertreten...
Naja, egal, werde mich da schon durchbeißen...
MfG,
Flox03!
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 07.05.03 11:50
| Flox03 hat folgendes geschrieben: | | Naja, das war mir irgendwie schon klar, aber irgendwas müssen die ja noch zusätzlich oder anders machen, |
Ich habe nichts spezielles für Win95 in der Unit gefunden. Ich finde auch ehrlich gesagt keine speziellen Hinweise oder Einschränkungen im PSDK, die Windows 95 betreffen würden.
| Zitat: | Habe mir grad so spontan überlegt, dass komischerweise nur die Methoden nicht gehen, die den Access auf KEY_READ stellen...
Zumindest nehme ich mal an, dass OpenKeyReadOnly das macht... |
Richtig.
| Zitat: | | Vielleicht mag das Win 95 nicht, weil OpenKey('',true) z.B. müsste den Access auf KEY_WRITE stellen (rein logisch betrachtet), oder KEY_ALL_ACCESS - und das funktioniert dann ja auch einwandfrei. |
Nein. Wenn du TRUE bei "OpenKey" angibst, dann verwendet die Unit RegCreateKeyEx. Gibst du FALSE an, dann RegOpenKeyEx. Das erklärt auch das Funktionieren. Existiert der Schlüssel nicht, wird er mit RegCreateKeyEx angelegt. Existiert er, dann liefert die Funktion das Handle auf diesen Schlüssel zurück, erzeugt ihn aber nicht noch einmal.
Die Zugriffsmodi KEY_WRITE usw. für RegOpenKeyEx sagen nur aus, wie auf einen Schlüssel zugegriffen werden kann und soll. Der Schlüssel muss in diesem Fall bereits existieren. KEY_READ besagt z.B., dass du Werte abfragen (= lesen) und Unterschlüssel auflisten kannst. Zum Ändern von Werten o.ä. brauchst du dann aber weitergehende Rechte.
| Zitat: | | Das Object/die Klasse TRegistry wird es ja mit Sicherheit schon recht lange geben, |
Laut Copyright von Borland in der TRegistry-Unit seit ´95.
| Zitat: | | und früher war ja Win 95 auch noch zahlreicher vertreten... |
Ja, aber wenn du dir mal anschaust, wie oft heute (und auch hier im Forum) noch geschimpft wird, wenn du die Registry zum Speichern von Daten benutzt, dann werden früher wohl noch weniger darauf zugegriffen haben. 
|
|
Flox03 
Hält's aus hier
Beiträge: 5
|
Verfasst: Do 08.05.03 15:40
THX für die ausfürlichen Erklärungen!!!
Nächste Woche weiss ich dann, ob das jetzt auch unter Win 95 läuft...
Wenns dann immer noch schief geht, sollen die sich halt 98 irgendwoher besorgen, mir dann auch egal... *gg*
MfG,
Flox03!
|
|
|