![]() |
Registry Key unter Win 7 aus D7-Anwendung heraus lesend öffnen
In einer D7-Anwendung möchte ich gerne lesend auf einen Key in der Registry zugreifen. Unter Win XP funktioniert das auch tadellos, nur unter Win 7 nicht, obwohl der Key laut regedit.exe definitiv vorhanden ist. Hier mein Code:
Delphi-Quellcode:
Was mache ich falsch? Das Registry.OpenKeyReadOnly schlägt fehl, auch wenn ich die Anwendung mit Administrator-Rechten ausführe.
function TForm1.IsVCPPRuntimeInstalled: Boolean;
const RegistryPfad = 'SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\' + 'UserData\S-1-5-18\Products\b25099274a207264182f8181add555d0\InstallProperties'; var Registry: TRegistry; DisplayName: string; DisplayVersion: string; begin Result := False; Registry := TRegistry.Create; try Registry.RootKey := HKEY_LOCAL_MACHINE; // prüfen, ob der Pfad auch wirklich existiert if (Registry.OpenKeyReadOnly(RegistryPfad)) then begin // den Namen und die Version auslesen DisplayName := Registry.ReadString('DisplayName'); DisplayVersion := Registry.ReadString('DisplayVersion'); if (AnsiUpperCase(DisplayName) = AnsiUpperCase('Microsoft Visual C++ 2005 Redistributable')) and (DisplayVersion = '8.0.56336') then begin Result := True; end; end; finally FreeAndNil(Registry); end; end; Danke im Voraus für eure Hilfe! |
AW: Registry Key unter Win 7 aus D7-Anwendung heraus lesend öffnen
UAC und die Virtualisierung spielen auch noch mit.
Versuche mal, ob es geht, wenn du deiner anwendung ein Win7-Kompatibilitäts-Manifest mitgibst. > ![]() > bzw. folgenden Teil in dein Manifest aufnehmen
Code:
Ansonsten gibt es auch Befehle, welche die Virtualisierung abschalten. (sollte sich bestimmt schon irgendwas in der DP finden lassen)
<assembly ...
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> <application> <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/> </application> </compatibility> |
AW: Registry Key unter Win 7 aus D7-Anwendung heraus lesend öffnen
Habe mir mal mithilfe deines Tools eine Manifest-Datei erzeugt, in der ich sowohl Vista-, als auch Win7-Kompatibilität angegeben habe. Die kompilierte Ressourcen-Datei habe ich dann mittels Compiler-Direktive "$R" in das Projekt eingebunden. "$INCLUDE" - wie in deinem Tool angegeben - brachte mir eine Fehlermeldung, weil mein D7 mit dem Binärcode in der manifest.res-Datei nicht klar kam.
Jedenfalls brachte das nichts, der Registry-Eintrag wurde trotzdem nicht gefunden. Wobei ich testweise auch mal unter D2007 ne Exe erzeugt und dort den Haken "Runtime Themes" gesetzt hatte, was glaube ich effektiv das gleiche bewirkt (Manifest einbinden)?!? Wie ich die Virtualisierung für eine alte D7-Anwendung komplett ausschalten kann, habe ich bisher noch nicht herausgefunden. Wobei ich gar nicht wusste, dass auch in der Registry Virtualisierung stattfindet, sondern nur auf Verzeichnis-Ebene (also bspw. unter C:\Programme\...). Was ich in der DP noch gefunden habe, ist dieser ![]() |
AW: Registry Key unter Win 7 aus D7-Anwendung heraus lesend öffnen
Man hätte ja dazu sagen können, dass es sich um 64 Bit handelt :roll:
|
AW: Registry Key unter Win 7 aus D7-Anwendung heraus lesend öffnen
Zitat:
Muss aber in der Tat eine Rolle spielen. Habe das ganze mal auf einem 32-Bit Windows 7 ausprobiert und dort funktioniert es. Jetzt muss ich nur noch rausfinden, wie ich das unter Win7 64-Bit zum Laufen kriege. Mit "TRegistry.Create(KEY_ALL_ACCESS OR KEY_WOW64_64KEY)" kann ich unter D7 ja nicht arbeiten, da der Wert KEY_WOW64_64KEY nicht bekannt ist. |
AW: Registry Key unter Win 7 aus D7-Anwendung heraus lesend öffnen
Hi,
hier solltest du die Entsprechung finden: ![]() LG, Frederic |
AW: Registry Key unter Win 7 aus D7-Anwendung heraus lesend öffnen
Zitat:
Delphi-Quellcode:
const
KEY_WOW64_64KEY = $0100; KEY_WOW64_32KEY = $0200; |
AW: Registry Key unter Win 7 aus D7-Anwendung heraus lesend öffnen
So, ich habe mich jetzt noch ne ganze Weile damit rumgeärgert, weil der Lösungsansatz aus dem oben genannten Thread bei mir nicht funktionieren wollte. Bis ich dahinter gekommen bin, dass man unter 64-Bit Windows die Methode "TRegistry.OpenKeyReadOnly" tunlichst nicht verwenden sollte! Immer "OpenKey" verwenden zusammen mit dem richtigen Access-Modus "KEY_READ or KEY_WOW64_64KEY", dann klappts auch mit dem Nachbarn :-D .
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz