64 Bit Progamme-Verzeichnis von 32 Bit Prozess aus ermitteln

Dalai

Grand Admiral Special
Mitglied seit
14.06.2004
Beiträge
7.420
Renomée
262
Standort
Meiningen, Thüringen
Hey Leute,

ich hätt da gern mal n Problem ;D. Einfach formuliert: Wie kann ich das 64 Bit "Program Files"-Verzeichnis von einem 32 Bit Prozess aus ermitteln?

Und bevor die Frage kommt, warum/wozu ich das brauche und solche Diskussionsverläufe wie hier entstehen: ich brauche es, um mit einem meiner Delphi-Programme (32 Bit) zu prüfen, ob eine bestimmte 64 Bit Anwendung bereits auf dem System vorhanden ist. Wobei "eine bestimmte" nicht ganz stimmt, denn es geht letztlich um eine unbekannte Zahl, die sich mit der Zeit ändern kann (und wohl auch wird). Weitere Details weiter unten im Post.

Ich habe natürlich schon gegooglet. Aber selbst wenn man die erst seit Vista verfügbare Funktion SHGetKnownFolderPath() mit der Konstante FOLDERID_ProgramFilesX64 (aus KNOWNFOLDERID) bemühen will, bekommt man von MS nur den Mittelfinger gezeigt *suspect*:
This value is not supported on 32-bit operating systems. It also is not supported for 32-bit applications running on 64-bit operating systems. Attempting to use FOLDERID_ProgramFilesX64 in either situation results in an error.

Bislang benutze ich die Registry bzw. die Umgebungsvariable %ProgramW6432% zur Ermittlung des Pfads, aber ich habe ja immer noch Hoffnung, dass es auch ohne diese Krämpfe geht :-/.


Weitere Details zur Problemstellung
Besagtes Delphi-Programm dient zur Installation von Software auf dem System. Die Definitionen dazu erfolgen in INI-Dateien, worin hinterlegt ist, wie die Software heißt, welche Version, welche OS sie unterstützt, den Pfad der Setupdatei usw. usf. Eine derartige INI sieht dann z.B. so aus:
Code:
[Script]
UID=ClassicShell3
Name=ClassicShell
Ver=3.2.0
Desc=Klassisches Startmenü & Explorer
Category=System
File="\Installs\System\ClassicShell\v3\Classic Shell 3.2.0.exe"
Systems=Vista_SP*, Vista_x64_SP*, 7_SP*, 7_x64_SP*
Default=0
RequireAdmin=1
Params=/qr ADDLOCAL=ClassicExplorer,ClassicStartMenu
InstallCheck=%ProgramFiles%\Classic Shell\ClassicStartMenuDLL.dll
X64=1
Prio=10
InstallSize=7
Um nun dem Benutzer visuell mitteilen zu können, ob eine bestimmte Software bereits auf dem System vorhanden ist (und wenn ja, in welcher Version), wird anhand von InstallCheck geprüft, ob die darin angegebene Datei vorhanden ist und dessen Version ermittelt. Ich muss also in der Lage sein, den Pfad des 64 Bit "Program Files" zu finden, damit die Findung auch auf einem 64 Bit Windows funktioniert. Dass ich hier statt der Umgebungsvariable keinen hartkodierten Pfad verwenden kann und will, versteht sich von selbst.

MfG Dalai
 
Tja wenn nix anderes hilft - direkt aus Registry auslesen:

ausm HKLM\Software\Microsoft\Windows\CurrentVersion
welches bei 32Bit auf 64 aus HKLM\Software\Wow6432Node\Microsoft\Windows\CurrentVersion gemappt wird

folgenden Wert auslesen "ProgramW6432Dir"


Etwas Delphi, benötig Unit Registry;


Function WoIstProgramme : String;
Var
Reg : TRegistry;

begin
Reg:=TRegistry.Create;
Reg.Rootkey:=HKEY_LOCAL_MACHINE;
RegOpenKey('\Software\Microsoft\Windows\CurrentVersion\');
if Reg.ValueExists('ProgramW6432Dir')
then
begin
Result:=Reg.ReadString('ProgramW6432Dir')
else
begin
Result:=Reg.ReadString('ProgramFilesDir')
end;
Reg.Free;
end; // of Function
 
Wow64DisableWow64FsRedirection + Wow64RevertWow64FsRedirection
 
Das habe ich bereits probiert, aber es bringt nichts. Weder für die Funktion SHGetFolderPath() noch für SHGetKnownFolderPath() noch für die durch Windows stattfindende Expandierung der Umgebungsvariablen via ExpandEnvironmentStrings(). Ist ja mehr oder minder auch logisch, denn es findet ja beim Ermitteln des Programme-Verzeichnisses erstmal kein Zugriff aufs Dateisystem statt, was die Funktionen Wow64DisableWow64FsRedirection() & Co aber behandeln.

MfG Dalai
 
Der Weg über die Registry geht von Windows NT 5.2 (XP64, Server 2003) bis NT 6.2 (8, Server 8 ).
 
Das habe ich bereits probiert, aber es bringt nichts. Weder für die Funktion SHGetFolderPath() noch für SHGetKnownFolderPath() noch für die durch Windows stattfindende Expandierung der Umgebungsvariablen via ExpandEnvironmentStrings(). Ist ja mehr oder minder auch logisch, denn es findet ja beim Ermitteln des Programme-Verzeichnisses erstmal kein Zugriff aufs Dateisystem statt, was die Funktionen Wow64DisableWow64FsRedirection() & Co aber behandeln.

MfG Dalai
Meines Wissens gibts das ganze auch noch für die Registry, mir fallen aber gerade die Namen nicht ein.
 
Meines Wissens gibts das ganze auch noch für die Registry, mir fallen aber gerade die Namen nicht ein.
Ja, ich weiß, es gibt Flags für RegOpenKeyEx() & Co (KEY_WOW64_64KEY) und genau die benutze ich ja auch, um die Redirection beim Lesen der Registry zu verhindern. Aber darum geht's mir ja nicht. Mir geht's darum, eine API-Funktion zu benutzen statt die Registry auszuwerten, wenn ich mir das Programme-Verzeichnis auf einem 64 Bit Windows hole.

Irgendwie wird mir MS immer suspekter. Nur weil die sich keine Anwendungsfälle für Dies und Jenes vorstellen können, heißt das nicht, dass es keine (durchaus sinnvollen) gibt. Dass sie nur deswegen FOLDERID_ProgramFilesX64 nicht unterstützen, ist irgendwie ... schräg, um's mal milde auszudrücken *suspect*.

MfG Dalai
 
Zurück
Oben Unten