在 Win64 操作系统中从 32 位应用程序解析 PROGRAMFILES 变量?
Posted
技术标签:
【中文标题】在 Win64 操作系统中从 32 位应用程序解析 PROGRAMFILES 变量?【英文标题】:Resolve PROGRAMFILES variable from 32bit app in Win64 OS? 【发布时间】:2018-03-23 07:23:54 【问题描述】:正如 MSDN 的 WOW64 Implementation Details 中所解释的,变量 %PROGRAMFILES%
,
在 64 位 Windows 操作系统上的 32 位进程中,解析为 C:\Program Files (x86)
在 64 位 Windows 操作系统上的 64 位进程中,解析为 C:\Program Files
您可以验证这一点,例如使用 Delphi 10.1 程序,使用 32 位 Windows 目标平台和 64 位 Windows 目标平台编译:
MyShellExecute('%PROGRAMFILES%');
那么,从在 Windows-64 位操作系统中执行的 32 位 Delphi 应用程序中,我怎样才能获得两者:
32 位程序的 ProgramFiles 目录 (C:\Program Files (x86)
)
64 位程序的 ProgramFiles 目录 (C:\Program Files
)
【问题讨论】:
我无法验证这一点,因为我没有函数MyShellExecute
,AFAIK。
@Rudy - 这可能是因为你忘了调整代词;你应该试试His/HerShellExecute
。 使用以下环境变量:
ProgramW6432
获取64位程序文件目录。
ProgramFiles(x86)
获取32位程序文件目录。
这些在 32 位和 64 位进程中返回相同的值。
当然,依赖环境变量总是有点脆弱。您的父进程始终可以在创建进程之前修改这些变量。
为了使您的程序更加健壮,您应该改用known folder IDs。使用FOLDERID_ProgramFilesX64
和FOLDERID_ProgramFilesX86
。
【讨论】:
FOLDERID_ProgramFilesX64
不支持在 64 位操作系统上运行的 32 位应用程序。在这种情况下尝试使用 FOLDERID_ProgramFilesX64 会导致错误。
是的。这记录在我链接到的主题中。从 64 位进程中,您可以找到 32 位文件夹。
通常只有安装人员才关心这些文件夹的位置,所以这并没有太大的限制。
我在这里遇到一种情况,当在 32 位程序中执行时,指向 64 位程序文件夹中的程序文件的 ShellLink 解析为 32 位程序文件夹中的错误路径在 64 位 Windows 上。
这听起来很奇怪。我想知道链接是如何解决的。无论如何,这是一个不同的话题。我想我在这里回答了具体问题。以上是关于在 Win64 操作系统中从 32 位应用程序解析 PROGRAMFILES 变量?的主要内容,如果未能解决你的问题,请参考以下文章