如何在自定义操作 DLL (MSI/Wix) 中获取“INSTALLED”属性?

Posted

技术标签:

【中文标题】如何在自定义操作 DLL (MSI/Wix) 中获取“INSTALLED”属性?【英文标题】:How to get "INSTALLED" property in Custom Action DLL (MSI/Wix)? 【发布时间】:2017-05-05 07:35:28 【问题描述】:

在我的自定义 DLL 中,我需要检查是否正在安装或卸载产品,因此需要获取 "INSTALLED" 属性的值(就像在 WiX 脚本中一样)。这是我在 C++ DLL 中所做的:

WCHAR propValue[MAX_PATH];
DWORD propValLen = MAX_PATH;
// MSIHANDLE msiHandle; 
MsiGetProperty(msiHandle, L"INSTALLED", propValue, &propValLen);
propValue[propValLen] = 0;

但结果总是一个空字符串(对于安装和卸载)!如何检查产品是否正在安装或卸载?

【问题讨论】:

如何安排此自定义操作? (请参阅Obtaining Context Information for Deferred Execution Custom Actions 了解我问的原因。) 是的,这就是我刚刚发现的问题。有些动作是即时的,有些是延迟的! @MichaelUrman,您能否将您的输入添加为答案?它将对其他人有用。这些信息在任何地方都不清楚。 blog.iswix.com/2011/10/beam-me-up-using-json-to-serialize.html @Ajay 这篇写于 2001 年的文章在我的“必读”列表中,并且非常详细地介绍了与这个问题相关的所有内容。 installsite.org/pages/en/isnews/200108 【参考方案1】:

属性名区分大小写,为“Installed”:https://msdn.microsoft.com/en-us/library/windows/desktop/aa369297(v=vs.85).aspx

【讨论】:

我已验证。对于自定义 DLL,它区分大小写。对于 MSI/Wix,它不是。是否可以使用 MSI 函数进行不区分大小写的查找? @Ajay AFAIK 没有不区分大小写的查询。只需在任何地方编写代码并解决正确的案例和问题。 其实你的答案是不正确的。 MSI 属性不区分大小写。这只是执行上下文。所有属性在“立即”自定义操作处理程序中都是可见的,但在“延迟”处理程序中没有任何属性可见。我刚刚注意到 DLL 本身被多次加载/卸载,因此无法将属性值存储在全局变量中! @Ajay,我使用 MSI 已有 18 年了。 MSI 属性肯定是区分大小写的。分为三类。私人、公共和安全。 Private 包含小写字母,Public 仅包含大写字母,Secure 是也列在 SecureCustomPublicProperties 属性中的公共属性。在 MSI 和任何创建 MSI 的工具中不存在不区分大小写的属性。

以上是关于如何在自定义操作 DLL (MSI/Wix) 中获取“INSTALLED”属性?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Qt GUI 编写 c++ dll,在自定义小部件中显示失败

分支 IO - 在自定义事件中显示推荐参数

Delphi DLL Project在自定义BPL中找不到单元,除非“Link with Runtime Packages”为True

如何在自定义操作栏上获取 onClickListener() 事件

如何在自定义操作的 ExeCommand 中添加对文件的引用?

如何自动启动使用 Msix 打包的应用程序?