2013-10-20 78 views
1

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

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

HKCU\Environment\ProgramFiles & HKLM\System\CurrentControlSet\Control\Session Manager\Environment\ProgramFiles可供使用?为什么还有其他注册表值?

+0

不,它使用SHGetKnownFolderPath()。由于appcompat的原因,注册表项被保留,太多的程序读取注册表而不是使用api函数。改变%ProgramFiles%是永远不会做你希望它会做的。 –

+0

我不太清楚读取注册表时出现什么问题,而不是使用API​​函数,但我认为后者是更干净/错误检查/等方式。然而,有趣的是,该程序似乎正在检查两者。可能超出范围,但是您是否知道如何安全地移动Program Files目录(请参阅http://support.microsoft.com/kb/933700/en-us)? – user66001

+0

你是对的,这是关键的问题。询问superuser.com。如果您要编写一个移动Program Files目录的安装程序,那么您最好签署一个[像这样的服务](http://www.bodyguardservice.net/eng/index.html)。 –

回答

1

Windows安装程序公开ProgramFilesFolderProgramFiles64Folder属性。行为是记录的,但实施不是。你只应该依靠这些属性而不是其他技术。

正式地,您需要一个使用ProgramFiles64Folder属性转到64位机器上的C:\ Program Files \的64位MSI。即使您使用自定义操作将目录显式设置为32位MSI中的此路径,安装程序也会拦截该路径并将其重定向到其认为的目录。这是为了应用程序兼容性目的。

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