如何从32位WOW进程获取Program Files文件夹路径(不是Program Files(x86))?

时间:2009-01-14 23:52:01

标签: c++ windows 64-bit

我需要从32位WOW进程获取本机(而不是WOW)程序文件目录的路径。

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

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

我想比较一下我从注册表中读取的一些值,如果值指向我的应用程序的WOW或本机版本的路径,那么我的代码会执行某些操作,否则它会执行其他操作。 要弄清楚应用程序的原生和WOW版本应该在哪里,我需要获取“Program Files(x86)”和“Program Files”的路径。

6 个答案:

答案 0 :(得分:21)

我感谢所有的帮助,尤其是这个帖子中的警告。但是,我确实需要这条路径,这就是我最终得到它的方式:

(为清楚起见,删除了错误检查,使用风险等等)

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

答案 1 :(得分:12)

让我在这个问题上引用 Raymond Chen excellent blogpost

  

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

     

这就是仿效的重点:   保持32位程序的快乐   模拟32位执行   环境。

     

...

     

问题是“这是什么方式   找到x64程序文件   来自32位应用程序的目录?“

     

答案是“工作更好   系统比反对它。“如果   你是一个32位的程序,那么你就是   打算对抗   每次尝试交互时都会使用模拟器   与外界隔绝。相反,只是   以64位重新编译安装程序   程序。有32位安装程序   检测到它在64位上运行   系统并启动64位安装程序   代替。 64位安装程序不会   在32位仿真层中运行,所以   当它试图复制文件或更新时   一个注册表项,它将看到真实的   64位文件系统和真正的64位   注册表中。

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

答案 2 :(得分:4)

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

SHGetKnownFolderPath函数可用于检索给定KnownFolder的完整路径。

答案 3 :(得分:1)

根据臭名昭着的雷蒙德·陈(Raymond Chen)最近发布的帖子,这几乎肯定是一个坏主意。有关详细信息,请参阅here。最重要的是,我认为可以做到,但这是一项艰苦的工作,而且几乎可以肯定有一种更简单的方法。

Microsoft构建了WOW仿真层,让您的生活更轻松。不要浪费所有的时间和精力来打击它: - )。

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

答案 4 :(得分:1)

我需要它从Logonscript获取x64程序文件夹并使用:

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

WScript.Echo sProgramDirPath

答案 5 :(得分:-2)

获取“程序文件”路径的最佳和通用方法是从注册表中查询它:

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

32位进程(Wow64)可以查询: HKEY_LOCAL_MACHINE \ SOFTWARE \微软\的Windows \ CurrentVersion \ ProgramFilesDir的 获取“C:\ Program Files(x86)” 使用 KEY_WOW64_64KEY 选项 HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ ProgramFilesDir 获取“C:\ Program Files”

的伪代码:

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