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

StackOverflow https://stackoverflow.com/questions/1958881

  •  21-09-2019
  •  | 
  •  

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

致电 SHGetKnownFolderPath(FOLDERID_ProgramFilesX64) 不要返回任何东西。这 微软软件定义网络 文章 已知文件夹ID 还指出这个特定的调用 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 位应用程序来说是一个问题。我们需要用适当的值覆盖它。

有帮助吗?

解决方案

正如您所提到的,从 32 位应用程序使用 SHGetKnownFolderPath 将无法在 64 位操作系统上运行。这是因为 Wow64 模拟已生效。

但是您可以使用 注册OpenKeyEx 传递旗帜 KEY_WOW64_64KEY 然后从注册表中读取程序文件目录。

注册表中的位置:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion

您对字符串值感兴趣:

程序文件目录

其他提示

如果您仔细阅读该页面,您将看到 64 位操作系统上的 32 位应用程序支持 FOLDERID_ProgramFilesX64。32 位操作系统不支持它,这是完全有道理的。

支持 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 并且路径已正确填充。

我已经使用了上面列出的注册表黑客,因为我找不到任何其他解决方法。

还可以查询环境变量 ProgramW6432. 。它显然只存在于64位Windows中,但它应该返回真正的64位Program Files目录,并且它似乎是为64位和32位程序定义的。至少它对我有用(C#, GetEnvironmentVariable)...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top