我需要从32位WOW进程获取本机(而不是WOW)程序文件目录的路径。
当我将CSIDL_PROGRAM_FILES(或CSIDL_PROGRAM_FILESX86)传递给SHGetSpecialFolderPath时,它返回WOW(Program Files(x86))文件夹路径。
如果可能的话,我宁愿避免使用环境变量。
我想比较一下我从注册表中读取的一些值,如果值指向我的应用程序的WOW或本机版本的路径,那么我的代码会执行某些操作,否则它会执行其他操作。 要弄清楚应用程序的原生和WOW版本应该在哪里,我需要获取“Program Files(x86)”和“Program Files”的路径。
答案 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)
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);