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 Registry Key unter Win 7 aus D7-Anwendung heraus lesend öffnen (https://www.delphipraxis.net/159780-registry-key-unter-win-7-aus-d7-anwendung-heraus-lesend-oeffnen.html)

MatthiasR 12. Apr 2011 15:56

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:
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;
Was mache ich falsch? Das Registry.OpenKeyReadOnly schlägt fehl, auch wenn ich die Anwendung mit Administrator-Rechten ausführe.

Danke im Voraus für eure Hilfe!

himitsu 12. Apr 2011 16:21

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.

> Hier im Forum suchenManifestCreator > unterstütztes Betriebssystem
> bzw. folgenden Teil in dein Manifest aufnehmen
Code:
<assembly ...

  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
    <application>
      <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
    </application>
  </compatibility>
Ansonsten gibt es auch Befehle, welche die Virtualisierung abschalten. (sollte sich bestimmt schon irgendwas in der DP finden lassen)

MatthiasR 13. Apr 2011 09:42

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 Thread. Da geht es darum, dass unter einem 64-Bit-Betriebssystem manche Registry-Zweige woandershin virtualisiert werden, als unter einem 32-Bit-Betriebssystem (wenn ich das richtig verstanden habe). Da es sich bei unserem Testsystem um ein 64-Bit-Win7 handelt, die Anwendung aber eine 32-Bit-Anwendung ist, könnte das u.U. auch der Grund sein.

DeddyH 13. Apr 2011 09:53

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:

MatthiasR 13. Apr 2011 10:14

AW: Registry Key unter Win 7 aus D7-Anwendung heraus lesend öffnen
 
Zitat:

Zitat von DeddyH (Beitrag 1094785)
Man hätte ja dazu sagen können, dass es sich um 64 Bit handelt :roll:

Hätte ich gewusst, dass es eine Rolle spielen könnte, hätte ich es getan :roll:

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.

fkerber 13. Apr 2011 10:25

AW: Registry Key unter Win 7 aus D7-Anwendung heraus lesend öffnen
 
Hi,

hier solltest du die Entsprechung finden:
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx


LG, Frederic

MatthiasR 13. Apr 2011 10:50

AW: Registry Key unter Win 7 aus D7-Anwendung heraus lesend öffnen
 
Zitat:

Zitat von fkerber (Beitrag 1094798)
hier solltest du die Entsprechung finden:
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

Danke dir! In dem von mir verlinkten Thread führt der Threadersteller den Key selbst schon ein, hatte ich völlig übersehen:
Delphi-Quellcode:
const
 KEY_WOW64_64KEY = $0100;
 KEY_WOW64_32KEY = $0200;

MatthiasR 13. Apr 2011 13:45

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 06:53 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