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

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

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

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

我想比较一下从registry中读取的一些值,如果这些值指向我的应用程序的WOW或本地版本的path,那么我的代码会执行某些操作,如果没有,则会执行其他操作。 要找出我的应用程序的本地和WOW版本的预期,我需要得到的path“程序文件(x86)”和“程序文件”。

Solutions Collecting From Web of "如何从32位WOW进程获取Program Files文件夹path(不是Program Files(x86))?"

我感谢所有的帮助,特别是在这个线程中的警告。 但是,我真的需要这条路,最终我是这样做的:

(清除错误检查清楚,使用风险自负等)

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

让我引用雷蒙德(Raymond Chen )在这个问题上的优秀博客 :

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

这就是仿真的要点:通过模拟32位执行环境来保持32位程序的快乐。

问题是“从32位应用程序中查找x64程序文件目录的方法是什么?”

答案是“ 与系统配合,而不是反对如果你是一个32位的程序,那么每当你尝试与外部世界进行交互的时候,你都会对抗模拟器。 相反,只需将您的安装程序重新编译为64位程序即可。 让32位安装程序检测到它正在64位系统上运行,然后启动64位安装程序。 64位安装程序不会在32位仿真层中运行,所以当它试图复制文件或更新注册表项时,它将看到真正的64位文件系统和真正的64位注册表。

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

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

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

根据臭名昭着的雷蒙德(Raymond Chen)最近的一个帖子,这几乎肯定是一个坏主意。 详情请看这里 。 底线,我认为这是可以做到的,但是这是一项艰苦的工作,而且几乎肯定有一个更简单的方法。

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

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

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

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

获得“程序文件”路径的最好和普遍的方法是从注册表中查询它:

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

32位进程(Wow64)可以查询: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ ProgramFilesDir KEY_WOW64_64KEY选项获取“C:\ Program Files文件(x86)” 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);