在 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 @Sertac:啊,是的,我忘了。 【参考方案1】:

使用以下环境变量:

ProgramW6432获取64位程序文件目录。 ProgramFiles(x86)获取32位程序文件目录。

这些在 32 位和 64 位进程中返回相同的值。

当然,依赖环境变量总是有点脆弱。您的父进程始终可以在创建进程之前修改这些变量。

为了使您的程序更加健壮,您应该改用known folder IDs。使用FOLDERID_ProgramFilesX64FOLDERID_ProgramFilesX86

【讨论】:

FOLDERID_ProgramFilesX64 不支持在 64 位操作系统上运行的 32 位应用程序。在这种情况下尝试使用 FOLDERID_ProgramFilesX64 会导致错误。 是的。这记录在我链接到的主题中。从 64 位进程中,您可以找到 32 位文件夹。 通常只有安装人员才关心这些文件夹的位置,所以这并没有太大的限制。 我在这里遇到一种情况,当在 32 位程序中执行时,指向 64 位程序文件夹中的程序文​​件的 ShellLink 解析为 32 位程序文件夹中的错误路径在 64 位 Windows 上。 这听起来很奇怪。我想知道链接是如何解决的。无论如何,这是一个不同的话题。我想我在这里回答了具体问题。

以上是关于在 Win64 操作系统中从 32 位应用程序解析 PROGRAMFILES 变量?的主要内容,如果未能解决你的问题,请参考以下文章

win32与win64的操作系统的区别是啥?

XP,32/64位Win7,32/64位Win8,32/64位Win10系统 春节版

Win64与Win32的本质区别

pyinstaller在64位系统下打包32位程序

什么叫win32?

Win7 32位和64位有啥区别?装哪个好?