【问题标题】:MSI ignoring %programfiles% environment variableMSI 忽略 %programfiles% 环境变量
【发布时间】:2013-10-20 06:37:43
【问题描述】:

我正在安装一个 MSI 应用程序,忽略 %programfiles% 环境变量。从 procmon 跟踪来看,它似乎使用了 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramFilesDir 的值。

为什么会这样做(我的意思是使用这个值是常见的做法,或者这是向 MSI 构建者公开的唯一值)?

HKCU\Environment\ProgramFilesHKLM\System\CurrentControlSet\Control\Session Manager\Environment\ProgramFiles 可供使用时,为什么还会存在这个其他注册表值?

【问题讨论】:

  • 不,它使用 SHGetKnownFolderPath()。由于 appcompat 原因保留了注册表项,太多程序读取注册表而不是使用 api 函数。改变 %ProgramFiles% 永远不会像你希望的那样做。
  • 我不太确定读取注册表的问题是什么,而不是使用 API 函数,但我认为后者是一种更干净/错误检查/等方式。然而,有趣的是,该程序似乎同时检查了两者。可能超出范围,但是您知道如何安全地移动 Program Files 目录(参见support.microsoft.com/kb/933700/en-us)吗?
  • 你说得对,这不是主题。在 superuser.com 上询问。如果您要编写一个移动 Program Files 目录的安装程序,那么您最好与 service like this 签约。

标签: windows-installer program-files


【解决方案1】:

Windows 安装程序公开了ProgramFilesFolderProgramFiles64Folder 属性。记录了该行为,但没有记录实施。你应该只依赖属性而不是其他技术。

正式地,您需要使用 ProgramFiles64Folder 属性的 64 位 MSI 才能转到 64 位计算机上的 C:\Program Files\。即使您使用自定义操作在 32 位 MSI 中将您的目录显式设置为此路径,安装程序也会截获该路径并将其重定向到它认为的预期目录。这是出于应用程序兼容性的目的。

有一种未公开的方式来颠覆这种行为。使用自定义操作获取预期文件夹并将其转换为短路径 (C:\Progra~1)。安装程序不会将其检测为无效,并将允许它通过。使用此功能需您自担风险。

【讨论】:

    猜你喜欢
    • 2012-09-05
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 2017-12-14
    • 2012-12-03
    • 2020-02-03
    相关资源
    最近更新 更多