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

8

Ich habe Probleme damit, den Speicherort des 64-Bit-Programmverzeichnisses unter 64-Bit-Windows Vista aus einer 32-Bit-Anwendung zu ermitteln.

Aufrufe an SHGetKnownFolderPath(FOLDERID_ProgramFilesX64) geben nichts zurück. Der MSDN -Artikel KNOWNFOLDERID gibt außerdem an, dass dieser bestimmte Aufruf mit FOLDERID_ProgramFilesX64 für eine 32-Bit-Anwendung nicht unterstützt wird.

Ich möchte so viel wie möglich vermeiden, den Pfad zu "C: \ Programme" fest zu kodieren. Etwas wie GetWindowsDirectory() zu tun, das Laufwerk aus dem Rückgabewert zu extrahieren und "\ Programme" hinzuzufügen, ist auch nicht attraktiv.

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

Hintergrund

Unsere Anwendung hat eine Service-Komponente, die andere Prozesse basierend auf Anfragen von benutzer-Session-spezifischen Komponenten starten soll. Die gestarteten Anwendungen können 32-Bit oder 64-Bit sein. Dies geschieht über CreateProcessAsUser() , indem ein Token vom Initiieren des Benutzersitzungsprozesses übergeben wird. Für den Aufruf von CreateProcessAsUser erstellen wir einen Umgebungsblock über die CreateEnvironmentBlock() API. Das Problem besteht darin, dass CreateEnvironmentBlock() mit dem Token der Benutzersitzungsanwendung einen Block mit ProgramW6432="C: \ Programme (x86)" erstellt, was ein Problem für 64-Bit-Anwendungen darstellt. Wir müssen es mit dem richtigen Wert überschreiben.

    
Karen Gabrielyan 24.12.2009, 16:15
quelle

4 Antworten

8

Wie Sie bereits erwähnt haben, funktioniert die Verwendung von SHGetKnownFolderPath aus einer 32-Bit-Anwendung nicht auf einem 64-Bit-Betriebssystem. Dies liegt daran, dass die Wow64-Emulation in Kraft ist.

Sie können jedoch RegOpenKeyEx verwenden, indem Sie das Flag KEY_WOW64_64KEY übergeben. und lies dann das Programmverzeichnis aus der Registry.

Der Ort in der Registrierung:

  

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion

Sie interessieren sich für den Zeichenfolgenwert:

  

ProgramFilesDir

    
Brian R. Bondy 24.12.2009, 17:08
quelle
1

Wenn Sie diese Seite sorgfältig lesen, werden Sie sehen, dass FOLDERID_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 durchaus Sinn macht.

    
Jeff Paquette 24.12.2009 16:23
quelle
0
  

FOLDERID_ProgramFilesX64 wird unterstützt ...

MSDN sagt, dass es unterstützt wird, aber Microsoft "WOW64" Best Practices Dokument sagt, dass es nicht ist. Siehe Ссылка

Um zu zitieren:

  

• Einige Variablen funktionieren nur, wenn der Prozess 64-Bit ist.   Beispielsweise funktioniert FOLDERID_ProgramFilesX64 nicht für 32-Bit-Aufrufer. In Windows-Versionen vor Windows 7 funktionierte% ProgramW6432% nicht im Kontext von 32-Bit-Prozessen. Eine Anwendung muss feststellen, ob sie in einem 64-Bit-Prozess ausgeführt wird, bevor sie diese Variablen verwendet.

Unter Windows 7 x64, das eine 32-Bit-Anwendung im Visual Studio-Debugger ausführt, erhalte ich auch einen Rückgabecode von 0x80070002 (und einen NULL-Zeiger). Das Ausführen des gleichen Codes, der als 64-Bit kompiliert wird, gibt den Wert S_OK zurück, und der Pfad wird ordnungsgemäß ausgefüllt.

Ich habe den Registry-Hack wie oben aufgeführt verwendet, da ich keine andere Problemumgehung finden kann.

    
Joe Marley 28.07.2010 20:14
quelle
0

Sie können auch die Umgebungsvariable ProgramW6432 abfragen. Es existiert offensichtlich nur in 64-Bit-Windows, aber es sollte das echte 64-Bit-Programmdateien-Verzeichnis zurückgeben, und es scheint für 64-Bit- und 32-Bit-Programme definiert zu sein. Zumindest funktionierte es für mich (C #, GetEnvironmentVariable ) ...

    
Dexter 19.08.2014 21:36
quelle

Tags und Links