代码之家  ›  专栏  ›  技术社区  ›  Ajay

用于MSI安装的数据持久性

  •  0
  • Ajay  · 技术社区  · 6 年前

    MSI安装将调用我的(原生/ C++)自定义动作函数。由于DLL是新加载的,并且对于每个函数(MIS/WIX脚本中指定的可调用的动作)单独启动MSsiExc.EXE进程,所以不能在C/C++程序中使用任何全局数据。

    如何(或在何处)存储有关正在进行的安装的一些信息? 我不能使用命名对象(如共享内存),因为启动dll以调用“action”函数的“process”将退出,而OS将不保留命名对象。

    我可以使用一个外部文件来存储,但是我如何知道(在dll的函数中):

    • 何时删除外部文件。
    • 何时发现此函数调用是第一个调用(操作/函数调用 Before="LaunchConditions" 可能会有帮助,不太确定)。

    如果无法删除该文件,则无法知道“信息”是当前的还是过时的(即属于先前失败/成功的msi运行)。

    我听说过“临时MSI表”,但不知道如何使用它。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Stein Åsmul    6 年前

    保留设置 说实话,我有点困惑你的习惯行为是怎么做的。但是,听起来他们保留了旧应用程序和安装程序版本的设置,如果MSI安装不正确,他们会将这些设置放回原位吗?

    迁移建议 (请认真考虑此选项):是否可以安装新的msi包并删除所有快捷方式,并在离开时访问旧应用程序? 改为安装?您的新应用程序版本将安装到新路径 和一个新的注册表配置单元,然后首先迁移 启动新应用程序,然后开始卸载 旧的应用程序-不知何故-或只是保留它的安装如果是 可接受的?旧安装中是否有COM服务器?其他有全球注册的东西?

    习俗行为禁欲 :以上只是避免自定义操作的建议。 There are many reasons to avoid custom actions (反对海关行动的宣传片)。如果在应用程序启动时迁移设置,则避免 sequencing , conditioning , impersonation 问题与 technical issues 您已经面临(还有更多)与自定义操作使用相关联的问题。最重要的是,你熟悉 debugging context (应用程序启动代码)与不熟悉的设置世界和它们的可调试性差相反。


    保留设置和数据 :对于在正在运行的msi实例中保存数据和设置,内置机制基本上是使用 Session.Property ( COM / VBScript MsiSetProperty ( Win32 打电话。这允许您保留msi中的字符串 Session 对象。某种全局数据。

    请注意,只能在 即时模式 (不更改系统的自定义操作),并将数据发送到延迟模式自定义操作(可以进行系统更改)非常涉及围绕 CustomActionData 概念(概念) more on deferred mode & CustomActionData )

    本质上,通过立即模式下的setproperty自定义操作,将字符串发送到延迟模式自定义操作。通常是一个“本地增长”的定界字符串,在立即模式下构造,并在延迟模式下接收时咀嚼成信息片段。你可以试着 use JSON-strings 类似于通过JSON字符串对对象进行序列化和反序列化,从而使传输更容易和更可靠。

    选择? 这个 集合属性 涉及到方法。有些人写信给 登记处 在安装过程中,或 临时文件 (在temp文件夹中)然后在msi的提交阶段进行清理,但我不喜欢这种方法,原因有很多。首先,提交自定义操作可能不会基于目标系统上的策略运行。( when rollback is disabled, no commit script is created -见“ 提交执行 “章节”,以及 it isn't best practice . 添加 临时行 是一个有趣的选择,我从来没有花太多时间在上面。我怀疑你是否能够轻易地用它来实现你所需要的,尽管我不知道你需要什么细节。我用得不好。 Quick sample . This RemoveFile example from WiX 可能会更好。