【发布时间】:2016-04-18 12:41:40
【问题描述】:
我需要获取我使用 InstalledShield 创建 .exe 的安装项目的产品编号。
我在 Installer API 中阅读了有关 MsiGetProductInfo() 的信息,但在示例代码 c# 中找不到任何用于应用此功能的信息。
谢谢。
【问题讨论】:
标签: c# .net windows-installer installshield setup-project
我需要获取我使用 InstalledShield 创建 .exe 的安装项目的产品编号。
我在 Installer API 中阅读了有关 MsiGetProductInfo() 的信息,但在示例代码 c# 中找不到任何用于应用此功能的信息。
谢谢。
【问题讨论】:
标签: c# .net windows-installer installshield setup-project
您指的是 MsiGetProductInfo,因此我假设您有一个 Windows Installer MSI 文件,您的 exe 会安装它(因为它引导先决条件),并且您希望在安装设置后获取信息。
这是 p/invoke 签名:
DllImport("msi.dll", CharSet=CharSet.Unicode)]
static extern Int32 MsiGetProductInfo(string product,
string property, [Out] StringBuilder valueBuf, ref Int32 len)
基本上 Product 是 MSI 的 ProductCode guid,它是一个用 {} 括号括起来的字符串。
您尚未发布任何您可能尝试过的代码,因此无法诊断您可能遇到的任何问题。如果“产品编号”是指版本,则可以使用此处记录的任何值:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa370130(v=vs.85).aspx
其中 INSTALLPROPERTY_VERSIONSTRING 之类的内容是在 Windows SDK 的 msi.h 中定义的,其值为“VersionString”。
在这个例子中也应该有足够多的信息:
MSI Interop using MSIEnumRelatedProducts and MSIGetProductInfo
UpgradeCode 通常对于许多不同的 ProductCode 在升级时保持不变,因此如果您在 UpgradeCode 上使用 MsiEnumRelatedProducts 返回 ProductCode,然后将该 ProductCode 插入 MsiGetProductInfo,则代码不会有太大变化。
【讨论】:
MsiGetProductInfo 无法工作,因为安装程序是使用 Wix Bootstrapper 构建的。你可以做的,这有点像黑客,是使用任何存档器(它最终是一个存档)打开可执行文件并解析名为0的文件,它是一个XML。您可以在那里找到所有信息,例如版本、产品名称、产品密钥等。
【讨论】: