2009-01-14 8 views
14

Je dois obtenir le chemin vers le répertoire de fichiers du programme natif (plutôt que le WOW) à partir d'un processus WOW 32 bits.Comment obtenir le chemin du dossier Program Files (pas Program Files (x86)) à partir du processus WOW 32 bits?

Lorsque je passe CSIDL_PROGRAM_FILES (ou CSIDL_PROGRAM_FILESX86) dans SHGetSpecialFolderPath, il renvoie le chemin du dossier WOW (Program Files (x86)).

Je préférerais éviter d'utiliser une variable d'environnement si possible. Je veux comparer certaines valeurs que j'ai lues dans le registre, si les valeurs pointent vers le chemin de la WOW ou de la version native de mon application, alors mon code fait quelque chose, sinon il fait quelque chose d'autre. Pour savoir où les versions natives et WOW de mon application sont censées être, je dois obtenir les chemins d'accès à "Program Files (x86)" et "Program Files".

+0

Vous ne devez pas compter sur l'endroit où votre programme "devrait être". Les applications sont là où l'utilisateur les veut. Les petits SSD deviennent populaires et ajoutent des emplacements d'installation supplémentaires à de nombreux PC. – MSalters

+0

Totalement, mais dans ce cas, il sera vraiment dans le dossier des fichiers du programme. –

+0

Pour moi, le pourquoi est la mise à jour d'une liste d'extensions pour Chrome, qui peut être dans AppData, Program Files (x86) ou Program Files. (Bien sûr, le nom de Program Files peut être quelque chose d'autre.) – tofutim

Répondre

21

J'apprécie toute l'aide et, surtout, les avertissements dans ce fil. Cependant, je vraiment besoin de ce chemin et voici comment je l'ai eu à la fin:

(vérification d'erreurs pour plus de clarté, utilisez à vos propres risques, etc.)

WCHAR szNativeProgramFilesFolder[MAX_PATH]; 
ExpandEnvironmentStrings(L"%ProgramW6432%", 
         szNativeProgramFilesFolder, 
         ARRAYSIZE(szNativeProgramFilesFolder); 
+0

Merci! Dans une circonstance spéciale, j'en ai besoin exactement. –

+0

Cela ne fonctionnait pas pour moi lors de l'exécution en tant que service –

12

Permettez-moi de citer Raymond Chen « s excellent blogpost sur la question:

Sur Windows 64 bits, les programmes 32 bits exécuter dans une couche d'émulation. Cette couche d'émulation simule l'architecture x86, la virtualisation du processeur, le système de fichiers, le registre, les variables d'environnement, les fonctions du système , tout cela. Si un programme 32 bits essaie de regarder le système, verra un système 32 bits. Pour exemple, si le programme appelle la fonction GetSystemInfo pour voir ce que le processeur est en cours d'exécution, il sera dit qu'il est en cours d'exécution sur un processeur 32 bits , avec une adresse de 32 bits espace , dans un monde avec un Ciel 32 bits et les oiseaux 32 bits dans les arbres 32 bits.

Et c'est le point de l'émulation: Pour maintenir le programme 32 bits heureux en simulant un environnement d'exécution 32 bits .

...

La question est "Quelle est la façon de trouver le répertoire Program Files x64 à partir d'une application 32 bits?"

La réponse est « Il est préférable de travailler avec le système que contre elle. » Si vous êtes un programme 32 bits, alors vous va se battre contre l'émulateur chaque fois vous essayez d'interagir avec le monde extérieur. Au lieu de cela, recompiler votre programme d'installation en tant que programme 64 bits . Demandez à l'installateur 32 bits de détecter qu'il s'exécute sur un système 64 bits et de lancer le programme d'installation 64 bits à la place. Le programme d'installation 64 bits ne fonctionnera pas dans la couche d'émulation 32 bits, alors lorsqu'il essayera de copier un fichier ou de mettre à jour une clé de registre , il verra le vrai système de fichiers 64 bits registre.

Si vous voulez toujours faire cela, je vous recommande de lire les commentaires sur ce blog car ils contiennent de bons indices.

+0

Un cas d'utilisation tout à fait légitime pour obtenir le 64b ProgFiles d'un programme 32b est quand il essaie de sauvegarder votre ordinateur mais veut ignorer les fichiers programme.Bien sûr, vous voulez ignorer le dossier 64b Program Files aussi. –

3

Vous êtes sur la bonne voie - Utilisez le KNOWNFOLDERID de FOLDERID_ProgramFilesX64

La fonction SHGetKnownFolderPath peut être utilisé pour récupérer le chemin complet d'un KnownFolder donné.

+2

N'est-ce pas seulement disponible sur Vista ou plus tard? Que se passe-t-il lorsque codde l'appelle sur Windows Vista pré-Windows? – paxdiablo

+0

Je viens de frapper ce problème, j'ai besoin de travailler sur XP et Server 2003 x64 aussi. –

+1

SHGetKnownFolderPath avec FOLDERID_ProgramFilesX64 ne fonctionne pas sur les versions 32 bits de Windows. Il est/était documenté comme fonctionnant mais, malheureusement, cela ne fonctionne pas réellement. Voir la section Contenu de la communauté ici: http://msdn.microsoft.com/en-us/library/bb762584%28VS.85%29.aspx –

1

Ceci est presque certainement une mauvaise idée, selon un post récent par l'infâme Raymond Chen. Voir here pour plus de détails. En bout de ligne, je pense que cela peut être fait, mais c'est beaucoup de travail et il y a certainement un moyen plus facile.

Microsoft a créé la couche d'émulation WOW pour vous faciliter la vie. Ne perdez pas tout leur temps et effort en le combattant :-).

Peut-être que si vous nous avez dit pourquoi vous avez besoin du répertoire de programmes non-WOW, nous pourrions vous aider plus loin.

1

je besoin pour obtenir le programme x64 dossier à partir d'un Logonscript et utilisé:

Dim oWshShell : Set oWshShell = CreateObject("WScript.Shell") 
Dim sProgramDirPath : sProgramDirPath = 
    oWshShell.ExpandEnvironmentStrings("%ProgramW6432%") 

WScript.Echo sProgramDirPath 
-2

la meilleure et universelle pour obtenir le chemin de « Program Files », est à l'interroger à partir du registre:

64 bits-processus peut interroger : HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ ProgramFilesDir pour obtenir "C: \ Program Files" HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion \ ProgramFilesDir pour obtenir « C: \ Program Files (x86) »

32-Bit-Process (Wow64) peut interroger: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ ProgramFilesDir pour obtenir "C: \ Program Files (x86)" HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ ProgramFilesDir avec KEY_WOW64_64KEY option! pour obtenir "C: \ Program Files"

Pseudo-code:

OpenKey(hKey, HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion", KEY_READ | KEY_WOW64_64KEY); 
QueryStringValue(hKey, L"ProgramFilesDir", sValue); 
+4

Vous devez utiliser les fonctions API pour récupérer l'emplacement: SHGetFolderPath ou ExpandEnvironmentStrings. – BCran

+1

Que faire si les clés de registre changent dans Windows 9? –

Questions connexes