C++ 如何从32位WOW进程中获取程序文件文件夹路径(而不是程序文件(x86))?

C++ 如何从32位WOW进程中获取程序文件文件夹路径(而不是程序文件(x86))?,c++,windows,64-bit,C++,Windows,64 Bit,我需要从32位WOW进程中获取本机(而不是WOW)程序文件目录的路径 当我将CSIDL_程序_文件(或CSIDL_程序_文件x86)传递到SHGetSpecialFolderPath时,它返回WOW(程序文件(x86))文件夹路径 如果可能的话,我宁愿避免使用环境变量 我想比较我从注册表中读取的一些值,如果这些值指向我的应用程序的WOW或本机版本的路径,那么我的代码会做一些事情,如果不是,它会做其他事情。 要确定我的应用程序的本地版本和WOW版本的预期位置,我需要获得“程序文件(x86)”和“程

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

当我将CSIDL_程序_文件(或CSIDL_程序_文件x86)传递到SHGetSpecialFolderPath时,它返回WOW(程序文件(x86))文件夹路径

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

我想比较我从注册表中读取的一些值,如果这些值指向我的应用程序的WOW或本机版本的路径,那么我的代码会做一些事情,如果不是,它会做其他事情。
要确定我的应用程序的本地版本和WOW版本的预期位置,我需要获得“程序文件(x86)”和“程序文件”的路径。让我引用Raymond Chen关于这个问题的观点:

在64位Windows上,32位程序运行 在仿真层中。这场比赛 层模拟x86体系结构, 虚拟化CPU、文件系统、, 注册表、环境 变量,系统信息 功能等等。如果是32位 程序试图查看系统, 它将看到一个32位系统。对于 例如,如果程序调用 GetSystemInfo函数来查看 处理器正在运行,它将被告知 它在32位上运行 处理器,具有32位地址 空间,在一个32位天空的世界里 32位树上的32位鸟

这就是模拟的重点: 要使32位程序满意,请执行以下操作: 模拟32位执行 环境

问题是“这条路怎么走?” 查找x64程序文件 32位应用程序中的目录?”

答案是“工作更好 与系统相比,与系统相对应。“如果 你是一个32位程序,然后你是 将要与 每次尝试交互时都使用模拟器 与外界接触。相反,只是 将安装程序重新编译为64位 节目。使用32位安装程序 检测它是否在64位上运行 系统并启动64位安装程序 相反64位安装程序将不会运行 在32位仿真层中运行,因此 当它试图复制文件或更新时 一个注册表项,它会看到真实的 64位文件系统和真正的64位 登记处


如果您仍然想这样做,我建议您阅读此博客帖子上的评论,因为它们包含一些很好的提示。

您走的是正确的道路-使用FOLDERID\u ProgramFilesX64的


该函数可用于检索给定Known文件夹的完整路径。

根据臭名昭著的Raymond Chen最近发布的ish帖子,这几乎肯定是个坏主意。有关详细信息,请参阅。总之,我认为这是可以做到的,但这是一项艰巨的工作,几乎可以肯定有一种更简单的方法

微软建立了魔兽世界仿真层,让你的生活更轻松。不要把他们所有的时间和精力都浪费在战斗上:-)


如果您告诉我们为什么需要非魔兽世界程序文件目录,我们可能会提供进一步帮助。

我感谢您提供的所有帮助,尤其是本帖中的警告。然而,我确实需要这条路,这就是我最终得到它的原因:

(为清晰起见,删除错误检查,使用风险自负等)


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

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

WScript.Echo sProgramDirPath

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

64位进程可以查询: HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramFilesDir 要获取“C:\Program Files” HKEY\U LOCAL\U MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\ProgramFilesDir 获取“C:\ProgramFiles(x86)”

32位进程(Wow64)可以查询: HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramFilesDir 获取“C:\ProgramFiles(x86)” HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramFilesDir带有KEY\u WOW64\u 64KEY选项! 要获取“C:\Program Files”

伪代码:

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

这不是仅在Vista或更高版本上可用吗?codde在Vista之前的Windows上调用此函数会发生什么情况?我刚刚遇到了这个问题,我需要它在XP和Server 2003 x64上也能工作。带有FOLDERID_程序文件x64的SHGetKnownFolderPath在32位版本的Windows上不工作。它被记录为工作,但不幸的是,它实际上不工作。请参阅此处的社区内容部分:您不应该依赖于您的程序“预期的位置”。这些应用程序是用户想要的。小型SSD正变得越来越流行,它们将为许多PC机添加额外的安装位置。总体而言,但在这种情况下,它实际上将位于program files文件夹中。对我来说,为什么要更新Chrome的扩展名列表,可能在AppData、program files(x86)或program files中。(当然,程序文件的名称可能是其他名称。)谢谢!在特殊情况下,,我正需要这个。你应该使用API函数获取位置:SHGetFolderPath或ExpandEnvironmentStrings。如果Windows 9中的注册表项发生更改,该怎么办?从32b程序获取64b程序文件的一个完全合法的用例是当它试图备份你的计算机,但想忽略程序文件时。当然,您也希望忽略64b程序文件文件夹。
OpenKey(hKey, HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion", KEY_READ | KEY_WOW64_64KEY);
QueryStringValue(hKey, L"ProgramFilesDir", sValue);