32位应用程序如何在Windows Vista 64位上找到64位Program Files目录的位置?

Kar*_*yan 8 vista64 32bit-64bit

我正在努力解决如何从32位应用程序确定64位Windows Vista上64位Program Files目录的位置的问题.

要求SHGetKnownFolderPath(FOLDERID_ProgramFilesX64)不要退货.该MSDN文章KNOWNFOLDERID还指出,与此特定的呼叫FOLDERID_ProgramFilesX64不支持32位应用程序.

我想尽可能避免硬编码"C:\ Program Files"的路径.做一些事情GetWindowsDirectory(),从返回值中提取驱动器并向其添加"\ Program Files"也不具吸引力.

32位应用程序如何从64位Windows Vista正确获取文件夹的位置?

背景

我们的应用程序有一个服务组件,它应该根据来自用户会话的组件的请求启动其他进程.启动的应用程序可以是32位或64位.我们通过CreateProcessAsUser()从启动用户会话进程传入令牌来实现此目的.对于调用CreateProcessAsUser,我们通过CreateEnvironmentBlock()API 创建一个环境块.问题是CreateEnvironmentBlock(),使用用户会话应用程序的令牌,使用ProgramW6432 ="C:\ Program Files(x86)"创建一个块,这对于64位应用程序来说是一个问题.我们需要用适当的值覆盖它.

Bri*_*ndy 8

如前所述,使用32位应用程序中的SHGetKnownFolderPath将无法在64位操作系统上运行.这是因为Wow64仿真有效.

但是,您可以使用RegOpenKeyEx传入标志KEY_WOW64_64KEY,然后从注册表中读取程序文件目录.

注册表中的位置:

HKEY_LOCAL_MACHINE\SOFTWARE \微软\的Windows\CurrentVersion

您对字符串值感兴趣:

ProgramFilesDir的

  • 64 位程序文件还有一个特殊的环境变量 - 无需直接从注册表中读取。但至少我现在知道如何访问 Wow6432Node 之外的注册表 :) (2认同)