【发布时间】:2015-12-25 16:00:08
【问题描述】:
我是 Windows 编程的菜鸟,但我必须创建一个棘手的 MSI 安装程序,通过 WiX 工具集安装插件。 安装程序应通过 Windows 注册表 API 在运行特定软件的所有已安装版本及其插件目录时进行检测。之后,它应该在带有适当复选框的单独页面(对话框)上显示所有这些。用户应该选择他们希望插件安装到的版本。
我创建了一个自定义操作(在 C++ 中并将其放入 MSI 数据库中的 DLL 中),它与注册表 API 交互然后循环结果并将临时记录添加到数据库表中:
- 添加路径属性以保持插件路径;
- 向 CheckBox 表中添加记录;
- 为它们添加属性以保持它们的状态;
- 为它们添加条件而不是检查它们的属性状态并启用/禁用它们;
- 根据状态属性添加事件以重置路径属性。
它在 AppSearch 之后运行
<InstallUISequence>
<Custom Action="PopulateVersions" After="AppSearch">Not Installed</Custom>
</InstallUISequence>
然后单击“下一步”按钮(我知道这样做是错误的)执行过滤活动属性路径的自定义操作,获取其中的第一个并执行 SetTargetPath 操作(它工作正常)。对于其余部分,该操作将适当的临时记录插入到:
- DuplicateFile 表,其中 DestFolder 是属性名称;
- Component 表,从原始组件中复制所有字段值,将 Component_Parent 字段值设置为原始值;
- 目录表。每个路径属性一条记录,Direcory_Parent 是 TARGETDIR;
它仅将插件安装到第一个属性路径引用(传递给 SetTargetPath 操作)。
很好...我在 WiX 标记中添加了一些引用我的自定义属性的 CopyFile 元素(我声明了一些属性以防止由于未知属性导致的 MSI 构建错误):
<Property Id="PathProperty0" Value="{}"/>
<Property Id="PathProperty1" Value="{}"/>
<Property Id="PathProperty2" Value="{}"/>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFiles64Folder">
<Directory Id="INSTALLLOCATION" Name="MyPluginDir">
<Component Id="PluginExt" Guid="C112184A-307C-5E15-994F-0DFDA9DD427E">
<File Id="MyPlugin" Name="MyPlugin.dll" Source="MyPlugin.dll" Vital="yes" />
<CopyFile Id="MyPlugin_Copy1" FileId="MyPlugin" DestinationProperty="PathProperty1"/>
<CopyFile Id="MyPlugin_Copy2" FileId="MyPlugin" DestinationProperty="PathProperty2"/>
</Component>
</Directory>
</Directory>
</Directory>
现在 ProgressDialog 说“{}”是无效路径,但所有属性都设置为有效路径(我已在调试中检查过)! 在显示要求访问同一 MSI 文件的提升 UAC 提示后,它似乎忘记或忽略所有临时数据库更改/属性更改。单击“安装”按钮后会出现提示(带有盾牌图标) .可能它再次读取数据库并没有发现内存或缓存中的任何更改,我不知道。
我做错了什么或如何正确制作该安装程序?恕我直言,我的实现过于复杂。我确实需要你的帮助。
【问题讨论】:
标签: wix windows-installer file-copying