Wie kann die 32-Bit-Anwendung den Speicherort des 64-Bit-Verzeichnisses für Programmdateien unter Windows Vista 64-Bit ermitteln?

Ich habe Probleme damit, den Speicherort des 64-Bit-Verzeichnisses "Programme" unter 64-Bit-Windows Vista in einer 32-Bit-Anwendung zu ermitteln.

Anrufe nachSHGetKnownFolderPath(FOLDERID_ProgramFilesX64) nichts zurückgeben. DasMSDN ArtikelKNOWNFOLDERID gibt auch an, dass dieser bestimmte Anruf mitFOLDERID_ProgramFilesX64 wird für eine 32-Bit-Anwendung nicht unterstützt.

Ich möchte so viel wie möglich vermeiden, den Pfad zu "C: \ Programme" festzukodieren. Etwas machen wieGetWindowsDirectory()Es ist auch nicht ansprechend, das Laufwerk aus dem Rückgabewert zu extrahieren und "\ Programme" hinzuzufügen.

Wie kann eine 32-Bit-Anwendung den Speicherort des Ordners unter 64-Bit-Windows Vista ordnungsgemäß ermitteln?

Hintergrund

Unsere Anwendung verfügt über eine Servicekomponente, die andere Prozesse basierend auf Anforderungen von benutzersitzungsspezifischen Komponenten starten soll. Die gestarteten Anwendungen können 32-Bit- oder 64-Bit-Anwendungen sein. Wir machen das überCreateProcessAsUser() durch Übergabe eines Tokens vom Initiieren des Benutzersitzungsprozesses. Zum anrufen anCreateProcessAsUsererstellen wir einen Umgebungsblock über dieCreateEnvironmentBlock() API. Das Problem ist, dassCreateEnvironmentBlock()Erstellt unter Verwendung des Tokens der Benutzersitzungsanwendung einen Block mit ProgramW6432 = "C: \ Programme (x86)", was für 64-Bit-Anwendungen ein Problem darstellt. Wir müssen es mit dem richtigen Wert überschreiben.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage