2009-01-14 153 views
14

我需要去本地(而不是WOW)的32位WOW处理程序的文件目录的路径。如何从32位WOW进程获取Program Files文件夹路径(不是Program Files(x86))?

当我将CSIDL_PROGRAM_FILES(或CSIDL_PROGRAM_FILESX86)传递到SHGetSpecialFolderPath时,它将返回WOW(Program Files(x86))文件夹路径。

我宁愿避免使用如果可能的环境变量。

我想比较的一些值我从注册表中读取,如果数值指向的我的应用程序无论是WOW或本地版本的路径,然后我的代码做一些事情,如果没有它别的东西。 要找出其中的本地和WOW我的应用程序的版本预计将我需要的路径为“程序文件(x86)”和“程序文件”。

+0

你不应该依赖于你的程序 “预计”。应用程序是用户想要它们的地方。小型SSD越来越受欢迎,它们将为许多PC增加额外的安装位置。 – MSalters 2009-01-15 15:29:39

+0

完全,但在这种情况下,它确实会在程序文件文件夹中。 – 2009-01-17 01:10:28

+0

对我来说,为什么要更新Chrome的扩展列表,这可能在AppData,Program Files(x86)或Program Files中。 (当然,Program Files的名字可能是别的。) – tofutim 2011-09-20 20:57:49

回答

21

我欣赏所有的帮助,尤其是在这个线程中的警告。不过,我真的需要这条道路,这是我到底怎么得到它:

(检查删除错误的清晰度,使用您自己的风险,等等)

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

让我引用雷蒙德陈在这个问题上的excellent blogpost

在64位Windows,32位程序运行在仿真层 。此仿真 层模拟x86架构, 虚拟化CPU,文件系统, 注册表,环境 变量,系统信息 函数,所有的东西。如果一个32位 程序尝试一下系统, 它会看到一个32位系统。对于 例如,如果程序调用 的GetSystemInfo函数来看看有什么 处理器运行时,它会被告知 ,它的上一个32位 处理器上运行,以32位地址 空间,在这个世界上,一个32位天空 和32位树中的32位鸟类。

而这就是仿真的要点: 保持32位程序开心 模拟32位执行 环境。

...

的问题是“什么是 从32位应用程序找到64位程序文件目录 的方式?”

答案是“这是更好地与系统不是反对它的工作 。”如果 你是一个32位程序,那么你 将要对抗每次 模拟器您尝试与外界交互 。相反,只是 重新编译安装程序为64位 程序。让32位安装程序 检测到它在64位的 系统上运行,而是启动64位安装程序 。 64位安装程序不会 运行在32位仿真层,所以 当它试图复制文件或更新 注册表项时,它会看到真正的 64位文件系统和真正的64位 注册表。

如果你还想这样做,我建议阅读这篇博文的评论,因为它们包含一些很好的提示。

+0

从32b程序获取64b ProgFiles的一个完全合法的用例是当它试图备份你的计算机,但是想忽略程序文件。当然你也想忽略64b Program Files文件夹。 – 2014-03-20 03:47:18

3

你是在正确的道路上 - 使用FOLDERID_ProgramFilesX64

SHGetKnownFolderPath功能KNOWNFOLDERID可以用来获取给定KnownFolder的完整路径。

+2

是不是只适用于Vista或更高版本? codde在Vista之前称之为Windows的时候会发生什么? – paxdiablo 2009-01-15 00:41:09

1

根据臭名昭着的Raymond Chen最近的一篇文章,这几乎肯定是一个坏主意。详情请参阅here。底线,我认为这是可以做到的,但这是一项艰苦的工作,而且几乎肯定有一种更简单的方法。

微软构建了WOW仿真层,让您的生活更轻松。不要浪费他们所有的时间和精力:-)。

也许如果你告诉我们为什么你需要非WOW Program Files目录,我们可以进一步提供帮助。

1

我需要它来获得从Logonscript的64位程序文件夹,使用:

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

WScript.Echo sProgramDirPath 
-2

最好的和通用的方式来获得路径“程序文件”,是从注册表查询它:

64位进程可以查询: HKEY_LOCAL_MACHINE \ SOFTWARE \微软\的Windows \ CurrentVersion \ ProgramFilesDir的 获得 “C:\ Program Files文件” HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \微软\的Windows \ CurrentVersion \ ProgramFilesDir的 获得“C:\程序文件(x86)”

32位进程(WOW64)可以查询: HKEY_LOCAL_MACHINE \ SOFTWARE \微软\的Windows \ CurrentVersion \ ProgramFilesDir的 获得 “C:\ Program Files文件(x86)的” HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ ProgramFilesDirKEY_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); 
相关问题