Wie kann die 32-Bit-Anwendung den Speicherort des 64-Bit-Programmdateienverzeichnisses unter Windows Vista 64-Bit finden?

StackOverflow https://stackoverflow.com/questions/1958881

  •  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.

War es hilfreich?

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)...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top