Как получить путь к папке Program Files (не Program Files (x86)) из 32-битного процесса WOW? - PullRequest
15 голосов
/ 15 января 2009

Мне нужно получить путь к каталогу исходных (а не к WOW) программных файлов из 32-битного процесса WOW.

Когда я передаю CSIDL_PROGRAM_FILES (или CSIDL_PROGRAM_FILESX86) в SHGetSpecialFolderPath, он возвращает путь к папке WOW (Program Files (x86)).

Я бы предпочел избегать использования переменной окружения, если это возможно.

Я хочу сравнить некоторые значения, которые я прочитал из реестра, если значения указывают на путь либо WOW, либо собственной версии моего приложения, тогда мой код что-то делает, если нет, то делает что-то другое. Чтобы выяснить, где ожидаются исходная и WOW-версия моего приложения, мне нужно получить пути к «Program Files (x86)» и «Program Files».

Ответы [ 6 ]

21 голосов
/ 17 января 2009

Я ценю всю помощь и, особенно, предупреждения в этой теме. Однако мне действительно нужен этот путь, и вот как я его получил в итоге:

(проверка ошибок удалена для ясности, используйте на свой страх и риск)

WCHAR szNativeProgramFilesFolder[MAX_PATH];
ExpandEnvironmentStrings(L"%ProgramW6432%", 
                       szNativeProgramFilesFolder, 
                       ARRAYSIZE(szNativeProgramFilesFolder);
12 голосов
/ 15 января 2009

Позвольте мне процитировать Раймонд Чен отличный пост по вопросу:

В 64-битной Windows запускаются 32-битные программы в слое эмуляции. Это эмуляция слой имитирует архитектуру x86, виртуализация процессора, файловой системы, реестр, среда переменные, системная информация функции, все такое. Если 32-битный программа пытается посмотреть на систему, он увидит 32-битную систему. За Например, если программа вызывает Функция GetSystemInfo, чтобы увидеть, что процессор работает, будет сказано что он работает на 32-битной процессор, с 32-битным адресом космос, в мире с 32-битным небом и 32-битные птицы на 32-битных деревьях.

И в этом смысл эмуляции: Чтобы 32-битная программа была довольна моделирование 32-битного исполнения окружающая среда.

...

Вопрос: «Каков путь найти программные файлы x64 каталог из 32-битного приложения? "

Ответ: " Лучше работать с системой, чем против."Если вы 32-битная программа, то вы будет бороться против эмулятор каждый раз, когда вы пытаетесь взаимодействовать с внешним миром. Вместо этого просто перекомпилируйте ваш установщик как 64-битный программа. Иметь 32-битный установщик обнаружить, что он работает на 64-битной система и запустить 64-битный установщик вместо. 64-разрядный установщик не будет работать в слое 32-битной эмуляции, так когда он пытается скопировать файл или обновить ключ реестра, он увидит реальный 64-битная файловая система и настоящая 64-битная реестр.

Если вы все еще хотите это сделать, я рекомендую прочитать комментарии к этому посту, так как они содержат несколько полезных советов.

4 голосов
/ 15 января 2009

Вы на правильном пути - используйте KNOWNFOLDERID из FOLDERID_ProgramFilesX64

Функция SHGetKnownFolderPath может использоваться для получения полного пути к указанному KnownFolder.

1 голос
/ 22 октября 2010

Мне нужно было получить папку программ x64 из Logonscript и использовать:

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

WScript.Echo sProgramDirPath
1 голос
/ 15 января 2009

Это почти наверняка плохая идея, согласно недавнему сообщению печально известного Рэймонда Чена. Смотрите здесь для деталей. Итог, я думаю, что это можно сделать, но это очень тяжелая работа, и почти наверняка есть более легкий путь.

Microsoft создала слой эмуляции WOW, чтобы сделать вашу жизнь проще. Не тратьте все свое время и силы на борьбу с ним: -).

Возможно, если вы скажете нам , почему вам нужен каталог программных файлов не-WOW, мы могли бы помочь вам в дальнейшем.

0 голосов
/ 23 марта 2012

Лучший и универсальный способ получить путь к «Программным файлам», это запросить его из реестра:

64-битный процесс может запросить: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ ProgramFilesDir чтобы получить "C: \ Program Files" HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion \ ProgramFilesDir чтобы получить "C: \ Program Files (x86)"

32-битный процесс (Wow64) может запрашивать: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ ProgramFilesDir чтобы получить "C: \ Program Files (x86)" HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ ProgramFilesDir с KEY_WOW64_64KEY ! чтобы получить "C: \ Program Files"

Псевдо-код:

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