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

标签 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中正确获取文件夹的位置?
背景
我们的应用程序具有一个服务组件,该组件应该根据特定于用户 session 的组件的请求启动其他进程。启动的应用程序可以是32位或64位。我们通过从启动用户 session 过程传入 token 来通过CreateProcessAsUser()做到这一点。为了调用CreateProcessAsUser,我们通过CreateEnvironmentBlock() API创建了一个环境块。问题是CreateEnvironmentBlock()使用用户 session 应用程序的 token 创建了带有ProgramW6432 =“C:\Program Files(x86)”的块,这对于64位应用程序是一个问题。我们需要用适当的值覆盖它。

最佳答案

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

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

注册表中的位置:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion



您对字符串值感兴趣:

ProgramFilesDir

关于32bit-64bit - 32位应用程序如何在Windows Vista 64位上找到64位Program Files目录的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1958881/

相关文章:

ios - 单个应用程序二进制文件如何支持 64 位和 32 位应用程序

git - msysgit-sh.exe-fork : Permission denied - Vista 64 bit

vb6 - Vista ProgramData 文件夹中缺少文件

c# - 从 Windows 文件资源管理器拖放到 Windows 窗体上不起作用

winapi - “some.exe” : 0xC0000005: Access violation executing location 0x00FF1230中0x00FF1230的未处理异常

sql - 为什么在Delphi XE7 64位和32位之间日期时间的处理方式不同?

java - Gstreamer Java "No such Gstreamer factory"- 为什么?

windows - 对于 64 位 Windows 上的 32 位应用程序,64 位操作是原子的吗

svn - TortoiseSVN 将无法连接到 Windows Vista 64 上的 subversion

.net - DB2 .NET 数据提供程序的 SQL1159 初始化错误,原因代码 7, token 9.5.0.DEF.2,SOFTWARE\IBM\DB2\InstalledCopies