Comment application 32 bits trouver l'emplacement de 64 bits répertoire Program Files sur Windows Vista 64 bits?

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

  •  21-09-2019
  •  | 
  •  

Question

Je suis aux prises avec un problème de la façon de déterminer l'emplacement du répertoire Program Files 64 bits sur 64 bits Windows Vista à partir d'une application 32 bits.

Les appels à SHGetKnownFolderPath(FOLDERID_ProgramFilesX64) ne rien retourner. article MSDN KNOWNFOLDERID indique également que cet appel particulier FOLDERID_ProgramFilesX64 n'est pas pris en charge pour une application 32 bits .

Je voudrais éviter autant que possible hardcoding le chemin de « C: \ Program Files ». Faire quelque chose comme GetWindowsDirectory(), extraire le disque de la valeur de retour et en ajoutant « \ Program Files » à ce ne sont pas non plus appel.

Comment une application 32 bits se correctement l'emplacement du dossier à partir de 64 bits de Windows Vista?

Historique

Notre application a un composant de service qui est censé lancer d'autres processus en fonction des demandes de composants spécifiques de sessions d'utilisateur. Les applications peuvent être lancées 32 bits ou 64 bits. Nous le faisons est par CreateProcessAsUser() en passant dans un jeton d'initiation processus de session utilisateur. Pour appel à CreateProcessAsUser, nous créons un bloc d'environnement via l'API CreateEnvironmentBlock(). Le problème est que CreateEnvironmentBlock(), en utilisant le jeton de l'application de session utilisateur, crée un bloc avec ProgramW6432 = « C: \ Program Files (x86) », qui est un problème pour les applications 64 bits. Nous devons la remplacer par la valeur appropriée.

Était-ce utile?

La solution

Comme vous l'avez mentionné, en utilisant SHGetKnownFolderPath à partir d'une application 32 bits ne fonctionnera pas sur un système d'exploitation 64 bits. En effet, l'émulation Wow64 est en vigueur.

Vous pouvez toutefois utiliser RegOpenKeyEx passant le KEY_WOW64_64KEY du drapeau, puis lire le répertoire des fichiers de programme à partir du registre.

L'emplacement dans le registre:

  

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion

Vous êtes intéressé par la valeur de chaîne:

  

ProgramFilesDir

Autres conseils

Si vous lisez cette page attentivement, vous verrez que FOLDERID_ProgramFilesX64 est pris en charge pour les applications 32 bits sur un système d'exploitation 64 bits. Ce ne sont pas pris en charge sur un système d'exploitation 32 bits, ce qui prend tout son sens.

  

FOLDERID_ProgramFilesX64 est pris en charge ...

MSDN dit qu'il est pris en charge, mais les meilleurs document pratiques « WOW64 » Microsoft dit que ce n'est pas. Voir http: // Télécharger .microsoft.com / téléchargement / A / F / 7 / AF7777E5-7DCD-4800-8A0A-B18336565F5B / wow64_bestprac.docx

Pour citer:

  

• Certaines variables ne fonctionnent que si le processus est de 64 bits.   Par exemple, FOLDERID_ProgramFilesX64 ne fonctionne pas pour les appelants 32 bits. Dans les versions de Windows antérieures à Windows 7,% ProgramW6432% ne fonctionnait pas dans le contexte des processus 32 bits. Une application doit déterminer si elle est en cours d'exécution dans un processus 64 bits avant d'utiliser ces variables.

Sous Windows 7 x64, l'exécution d'une application 32 bits dans le débogueur Visual Studio, je reçois également un code de retour de 0x80070002 (et un pointeur NULL). Exécution du même code compilé sous la forme retourne 64 bits la valeur S_OK et le chemin est correctement rempli.

Je l'ai utilisé le registre pirater comme indiqué ci-dessus car je ne peux pas trouver une autre solution.

Vous pouvez également interroger la ProgramW6432 variable d'environnement. Il existe évidemment que dans Windows 64 bits, mais il doit retourner le vrai répertoire Program Files 64 bits, et il semble être défini pour les 64 bits et des programmes 32 bits. Au moins, il a travaillé pour moi (C #, GetEnvironmentVariable) ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top