Wie kann die 32-Bit-Anwendung den Speicherort des 64-Bit-Programmdateienverzeichnisses unter Windows Vista 64-Bit finden?
-
21-09-2019 - |
Frage
Ich kämpfe mit einem Problem, wie ich den Standort des 64-Bit-Programmdateienverzeichnisses auf 64-Bit-Windows Vista aus einer 32-Bit-Anwendung ermitteln kann.
Anrufe an SHGetKnownFolderPath(FOLDERID_ProgramFilesX64)
gibt nichts zurück. Das Msdn Artikel Bekannter Folderid gibt auch an, dass dieser besondere Aufruf mit FOLDERID_ProgramFilesX64
wird nicht für eine 32-Bit-Anwendung unterstützt.
Ich möchte so viel wie möglich vermeiden, den Pfad zu "C: Programme" zu starten. So etwas wie GetWindowsDirectory()
, Es ist auch nicht ansprechend, das Laufwerk aus dem Rückgabewert zu extrahieren und " Programme" hinzuzufügen.
Wie kann eine 32-Bit-Anwendung die Position des Ordners von 64-Bit-Windows Vista ordnungsgemäß erhalten?
Hintergrund
Unsere Anwendung verfügt über eine Servicekomponente, die andere Prozesse basierend auf Anfragen von Benutzer-Session-spezifischen Komponenten starten soll. Die gestarteten Anwendungen können 32-Bit oder 64-Bit sein. Wir tun dies über via CreateProcessAsUser()
Durch die Übergabe eines Tokens vom Initiieren von Benutzersitzungsprozessen. Für Anruf an CreateProcessAsUser
, Wir erstellen einen Umgebungsblock über die CreateEnvironmentBlock()
API. Das Problem ist, dass CreateEnvironmentBlock()
, Erstellt mit dem Token der Benutzersitz-Anwendung 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.
Lösung
Wie Sie bereits erwähnt haben, funktioniert die Verwendung von shGet KnownicfolderPath von einer 32-Bit-Anwendung nicht auf einem 64-Bit-Betriebssystem. Dies liegt daran, dass die WOW64 -Emulation in Kraft ist.
Sie können jedoch verwenden Regopenkeyex In die Flagge vorbeikommen KEY_WOW64_64KEY
Lesen Sie dann das Verzeichnis der Programmdateien aus der Registrierung.
Der Standort in der Registrierung:
HKEY_LOCAL_MACHINE Software Microsoft Windows CurrentVersion
Sie interessieren sich für den Zeichenfolgenwert:
ProgramFilesDir
Andere Tipps
Wenn Sie diese Seite sorgfältig lesen, sehen Sie, dass orderID_programFilesX64 für 32-Bit-Anwendungen auf einem 64-Bit-Betriebssystem unterstützt wird. Es wird nicht auf einem 32-Bit-Betriebssystem unterstützt, was vollkommen sinnvoll ist.
Orderid_programFilesX64 wird unterstützt ...
MSDN sagt, dass es unterstützt wird, aber Microsofts "Wow64" -Kapital -Dokument sagt, dass es nicht so ist. Sehen http://download.microsoft.com/download/a/f/7/af7777e5-7dcd-4800-8a0a-b18336565f5b/wow64_bestprac.docx
Zitieren:
• Einige Variablen funktionieren nur, wenn der Prozess 64-Bit ist. Beispielsweise funktioniert orderID_ProgramFilesX64 für 32-Bit-Anrufer nicht. In Versionen von Windows früher als Windows 7 funktionierten % ProgrammW6432 % im Zusammenhang mit 32-Bit-Prozessen nicht. Eine Anwendung muss bestimmen, ob sie in einem 64-Bit-Prozess ausgeführt wird, bevor diese Variablen verwendet werden.
Unter Windows 7 X64, der im Visual Studio-Debugger eine 32-Bit-App ausführt, erhalte ich auch einen Rückgaberodus von 0x80070002 (und einen Nullzeiger). Das Ausführen des gleichen Codes wie 64-Bit gibt den Wert S_OK zurück und der Pfad wird ordnungsgemäß ausgefüllt.
Ich habe den Registrierungshack wie oben aufgeführt verwendet, da ich keine andere Problemumgehung finden kann.
Sie können auch die Umgebungsvariable abfragen ProgramW6432
. Es existiert offensichtlich nur in 64-Bit-Fenstern, sollte jedoch das Real 64-Bit-Programmdateienverzeichnis zurückgeben, und es scheint sowohl für 64-Bit- als auch für 32-Bit-Programme definiert zu sein. Zumindest hat es bei mir funktioniert (C#,, GetEnvironmentVariable
)...