9

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

呼吁SHGetKnownFolderPath(FOLDERID_ProgramFilesX64)不返回任何东西。MSDN文章KNOWNFOLDERID还指出FOLDERID_ProgramFilesX6432 位应用程序不支持此特定调用。

我想尽可能避免硬编码“C:\Program Files”的路径。做类似的事情GetWindowsDirectory(),从返回值中提取驱动器并将“\ Program Files”添加到它也没有吸引力。

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

背景

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

4

4 回答 4

9

正如您所提到的,在 32 位应用程序中使用 SHGetKnownFolderPath 不适用于 64 位操作系统。这是因为 Wow64 仿真有效。

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

注册表中的位置:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion

您对字符串值感兴趣:

程序文件目录

于 2009-12-24T17:08:39.007 回答
1

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

于 2009-12-24T16:23:23.433 回答
1

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

于 2014-08-19T21:36:12.753 回答
0

支持 FOLDERID_ProgramFilesX64...

MSDN 说它受支持,但 Microsoft 的“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 并且路径已正确填写。

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

于 2010-07-28T20:14:11.887 回答