Autor Beitrag
AScomp
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 162


Delphi 5, Delphi 7, Delphi 2007, Delphi 2009, Delphi XE, Delphi 10 Seattle
BeitragVerfasst: Mo 16.08.10 18:18 
Hallo,

offensichtlich funktionieren die Funktion KeyExists, OpenKeyReadOnly und DeleteKey von TRegistry nicht im Bereich HKLM\SOFTWARE\Microsoft\Windows\ auf Windows 64 Bit-Systemen.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
var
   Reg: TRegistry;
begin
     Reg := TRegistry.Create(KEY_ALL_ACCESS OR $0100);
     Reg.RootKey := HKEY_LOCAL_MACHINE;
     if Reg.KeyExists('\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{9DECD0F9-D3E8-48B0-A390-1CF09F54E3A4}'then
        ShowMessage('Existiert')
     else begin
        if Reg.OpenKeyReadOnly('\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{9DECD0F9-D3E8-48B0-A390-1CF09F54E3A4}'then
           ShowMessage('Existiert DOCH!')
        else begin
           if Reg.OpenKey('\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{9DECD0F9-D3E8-48B0-A390-1CF09F54E3A4}', false) then
              ShowMessage('Existiert eben DOCH!');
        end;
     end;
     if Reg.DeleteKey('\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{9DECD0F9-D3E8-48B0-A390-1CF09F54E3A4}'then
        ShowMessage('Erfolg')
     else
        ShowMessage('Kein Erfolg');
     Reg.Free;
end;


War nur ein ganz einfaches Beispiel, um dies zu testen (Windows 7 64 Bit). Die ID existiert, habe auch diverse andere ausprobiert.

Mit $0100 im TRegistry.Create gebe ich explizit an, dass keine Umleitung in den 32 Bit-Bereich erfolgen soll, was soweit auch funktioniert. Allerdings funktionieren Funktionen wie KeyExists und DeleteKey nicht korrekt.

Vielleicht hat ja jemand eine Idee hierzu. RegDisableReflectionKey hab ich auch schon gefunden, allerdings konnte ich bisher nicht herausfinden, wie dies zu nutzen ist.

EDIT: Beispiel etwas angepasst. KeyExists und OpenKeyReadOnly funktionieren NICHT, OpenKey hingegen schon. Alles mit Adminrechten getestet. Ausgaben sind "Existiert eben doch!" und "Kein Erfolg!".

Danke und Gruß

Andy
AScomp Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 162


Delphi 5, Delphi 7, Delphi 2007, Delphi 2009, Delphi XE, Delphi 10 Seattle
BeitragVerfasst: Mo 16.08.10 18:59 
qc.embarcadero.com/wc/qcmain.aspx?d=23429

-> Delphi und 64 Bit vertragen sich einfach nicht.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 16.08.10 20:11 
Das hat nichts speziell mit Delphi zu tun.
Dezipaitor
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 220



BeitragVerfasst: Mo 16.08.10 23:50 
Doch hat mit Delphi zu tun, d.h. mit der CL.
TRegistry verwendet RegDeleteKey, welches das DesiredAccess Flag KEY_WOW64_64KEY von RegOpenKeyEx ignoriert. Man muss stattdessen RegDeleteKeyEx verwenden, welches nur in XP 64bit und ab Vista verfügbar ist.
Ich werde da wohl oder übel noch ein QC Eintrag machen (wenn nicht schon geschehen) und was darüber im JEDI Blog schreiben. Das wird sonst vielleicht akkut.

N8

_________________
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: blog.delphi-jedi.net = JEDI API LIB & Windows Security Code Library (JWSCL)