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

时间:2009-12-24 16:15:17

标签: 32bit-64bit vista64

我正在努力解决如何从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位应用程序来说是一个问题。我们需要用适当的值覆盖它。

4 个答案:

答案 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)......