Получить путь к папке «Program Files», содержащей 32-битные программы - PullRequest
9 голосов
/ 02 января 2012

Как определить полный путь к папке, содержащей 32-битные программы, с использованием VBA? В 32-битных системах Windows он называется «Program Files», а в 64-битных системах - «Program Files (x86)».

Ответы [ 4 ]

14 голосов
/ 02 января 2012

Environ сделает свое дело:

debug.print Environ("ProgramFiles") 
debug.print Environ("PROGRAMFILES(X86)")

'If you want to check if current PC is x64
debug.print Environ("PROCESSOR_IDENTIFIER")

Список переменных среды можно найти здесь .


UPDATE :Основываясь на разговоре, который я имел с Кристианом и основываясь на моих комментариях, я рассмотрел это немного подробнее.

У меня есть две машины, на которых я тестировал:

  • Машина 1 : Win 7 Ultimate, 64-разрядная, Office 2010, 64-разрядная
  • Машина 2 : Win 7 Ultimate, 32-разрядная, Office 2007, 32-разрядная

В ближайшем окне я запустил следующие операторы:

? Environ("ProgramFiles") 
? Environ("PROGRAMFILES(X86)")
? Environ("ProgramW6432")

Результаты

Машина 1:

C:\Program Files 
C:\Program Files (x86) 
C:\Program Files

Машина 2:

C:\Program Files
//Blank//
//Blank//

Итак, исходя из этих ограниченных выводов, вы можете посмотреть, имеет ли значение ProgramW6432 .Если нет, предположим, что 32-битный и использовать ProgramFiles .

IF Environ("ProgramW6432") <> "" THEN
   'I'm 64 bit so check both ProgramW6432 and PROGRAMFILES(X86)
ELSE
   'I'm 32 bit so check ProgramFiles
END IF

И наоборот, вы можете использовать PROCESSOR_IDENTIFIER, чтобы определить x64 против x86 и сделать то же самое.

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

9 голосов
/ 26 июня 2012

Универсальный магазин

Я подумал, что суммирую выводы, которые можно сделать из информации, разбросанной по всем ответам здесь, плюс небольшая интеграция с моей стороны. Кредиты на все предыдущие постеры ответов!

Вывод Environ для любой заданной переменной среды, связанной с «программным файлом», будет варьироваться в зависимости от Windows (32 или 64-разрядная версия), а также Office (32 или 64-разрядная версия) следующим образом:

Windows Office  ProgramFiles            PROGRAMFILES(X86)       ProgramW6432
------- ------  ----------------------  ---------------------   ----------------
32-bit  32-bit  C:\Program Files        [empty string]          [empty string]
64-bit  32-bit  C:\Program Files (x86)  C:\Program Files (x86)  C:\Program Files 
64-bit  64-bit  C:\Program Files        C:\Program Files (x86)  C:\Program Files

Обратите внимание, что для установки Windows 64 bit + Office 32 bit вывод Environ("ProgramFiles") не не совпадает с фактическим значением переменной среды ProgramFiles в Windows! В командной строке echo %ProgramFiles% возвращает C:\Program Files, а не C:\Program Files (x86).

Если вам нужен путь к папке с 32-битными программными файлами (C:\Program Files для 32-битной Windows и C:\Program Files (x86) для 64-битной Windows), вы можете использовать эту функцию:

Function Get32BitProgramFilesPath() As String
    If Environ("ProgramW6432") = "" Then
       '32 bit Windows
       Get32BitProgramFilesPath = Environ("ProgramFiles")
    Else
       '64 bit Windows
       Get32BitProgramFilesPath = Environ("ProgramFiles(x86)")
    End If
End Function
6 голосов
/ 02 января 2012

ответ ray023 в основном правильно, но одно дополнение:

По крайней мере, на моей машине (Win 7 Home Premium 64 bit, Access 2000 установлен), оба
Environ("ProgramFiles") и
Environ("PROGRAMFILES(X86)")

... вернуть ту же папку, C:\Program Files (x86).

Чтобы получить «не-x86-папку» (C:\Program Files) в моей 64-битной Windows, мне нужно использовать Environ("ProgramW6432").

Вот еще одна ссылка о функции Environ, включая код для перечисления всех переменных среды (вот как я нашел ProgramW6432).


EDIT:

Как я уже сказал в комментарии, я только что протестировал его на другом компьютере, так как результаты, похоже, зависят не только от операционной системы, но и от установленной версии MS Office:

Этот компьютер работает под управлением Windows XP с пакетом обновления 3 (SP3), 32-разрядная версия и установлен Access 2000:

Environ("ProgramFiles") возвращает C:\Programme.
(это «Program Files» на немецком языке - я нахожусь в Германии, а у меня Windows на немецком языке)

Environ("PROGRAMFILES(X86)") и Environ("ProgramW6432") возвращают пустую строку.

-> Таким образом, самый безопасный способ определить «папку x86» (независимо от того, используется ли она в Win XP или Win 7) - Environ("ProgramFiles").

4 голосов
/ 02 января 2012

Вот статья, показывающая, как читать эту информацию из реестра:

http://accesstips.wordpress.com/2010/01/08/get-a-computers-program-files-folder-path-with-access-vba-and-wmi/

В комментариях к этой статье также есть подсказка, как извлечь информацию изпеременная окружения "ProgramFiles".Но будьте осторожны, если у вас разные разделы, может быть несколько папок «Program Files», например, "C:\Program Files" и "D:\Program Files".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...