我正在努力解决如何从32位应用程序确定64位Windows Vista上64位Program Files目录的位置的问题。
致SHGetKnownFolderPath(FOLDERID_ProgramFilesX64)
的电话不会返回任何内容。 MSDN文章 KNOWNFOLDERID 还声明,32位应用程序不支持使用FOLDERID_ProgramFilesX64
进行此特定调用。
我想尽可能避免硬编码“C:\ Program Files”的路径。
执行GetWindowsDirectory()
之类的操作,从返回值中提取驱动器并向其添加“\ Program Files”也不具吸引力。
32位应用程序如何从64位Windows Vista正确获取文件夹的位置?
我们的应用程序有一个服务组件,它应该根据来自用户会话的组件的请求启动其他进程。启动的应用程序可以是32位或64位。我们通过从启动用户会话进程传入令牌来通过CreateProcessAsUser()
执行此操作。对于CreateProcessAsUser
的调用,我们通过CreateEnvironmentBlock()
API创建了一个环境块。问题是CreateEnvironmentBlock()
使用用户会话应用程序的标记创建了一个ProgramW6432 =“C:\ Program Files(x86)”的块,这对于64位应用程序来说是一个问题。我们需要用适当的值覆盖它。
答案 0 :(得分:8)
正如您所提到的,使用32位应用程序中的SHGetKnownFolderPath将无法在64位操作系统上运行。这是因为Wow64仿真有效。
但是,您可以使用RegOpenKeyEx传递标记KEY_WOW64_64KEY
,然后从注册表中读取程序文件目录。
注册表中的位置:
HKEY_LOCAL_MACHINE \ SOFTWARE \微软\的Windows \ CurrentVersion
您对字符串值感兴趣:
ProgramFilesDir的
答案 1 :(得分:1)
如果仔细阅读该页面,您将看到64位操作系统上的32位应用程序支持FOLDERID_ProgramFilesX64。它在32位操作系统上不受支持,这完全合理。
答案 2 :(得分:0)
支持FOLDERID_ProgramFilesX64 ......
MSDN表示支持它,但微软的“WOW64”最佳实践文档表明它不支持。见http://download.microsoft.com/download/A/F/7/AF7777E5-7DCD-4800-8A0A-B18336565F5B/wow64_bestprac.docx
引用:
•某些变量仅在进程为64位时才有效。 例如,FOLDERID_ProgramFilesX64不适用于32位调用者。在早于Windows 7的Windows版本中,%ProgramW6432%在32位进程的上下文中不起作用。应用程序必须在使用这些变量之前确定它是否在64位进程中运行。
在Windows 7 x64下,在Visual Studio调试器中运行32位应用程序,我还得到一个0x80070002(和一个NULL指针)的返回码。运行编译为64位的相同代码将返回值S_OK并正确填充路径。
我使用了上面列出的注册表黑客,因为我找不到任何其他解决方法。
答案 3 :(得分:0)
您还可以查询环境变量ProgramW6432
。它显然只存在于64位Windows中,但它应该返回真正的64位Program Files目录,它似乎是为64位和32位程序定义的。至少它对我有用(C#,GetEnvironmentVariable
)......