【问题标题】:Reading current installed version of an application using windows api使用 windows api 读取应用程序的当前安装版本
【发布时间】:2011-09-10 20:52:26
【问题描述】:

我试图使用 windows api 来查找已安装应用程序的版本信息。

我使用升级代码通过 MsiEnumRelatedProducts api 查找产品代码,但是当我尝试使用产品代码使用 MsiGetProductInfo 时,版本信息作为垃圾返回。

这是我的 MsiGetProductInfo api:

[DllImport("msi.dll", CharSet = CharSet.Unicode)]
private static extern Int32 MsiGetProductInfo(
    string product, string property, [Out] StringBuilder valueBuf,
    ref Int32 len);

MsiGetProductInfo(sbProductCode, "INSTALLPROPERTY_INSTALLVERSION", builder, ref len);

对我做错了什么有什么想法吗?

【问题讨论】:

  • 我自己解决了这个问题:我只需要更改字符串属性以使用 VersionString 就可以了。
  • 您应该发布您的代码作为答案。
  • 感谢TMB指出,下次我会记住的。

标签: c# windows winapi


【解决方案1】:

作为对@JoshHetland 的回应,要传递的字符串是INSTALLPROPERTY_VERSIONSTRING 的驼峰式后缀 - 请记住,MSI 区分大小写。

所以:

INSTALLPROPERTY_VERSIONSTRING 变为 VersionString

INSTALLPROPERTY_INSTALLDATE 变为 InstallDate

等等。

可用属性的完整列表位于MSDN page for the MsiGetProductInfo function

【讨论】:

  • 非常感谢您指出应该记录在 InstallShield 或 MSDN 中的注释。
【解决方案2】:

这是我解决问题的方法。

        Int32 m_len = 11512;
        StringBuilder m_versionInfo = new StringBuilder(m_len);

        StringBuilder m_sbProductCode = GetProductCodeFromMsiUpgradeCode();
        MsiGetProductInfo(m_sbProductCode.ToString(), "**VersionString**", m_versionInfo, ref m_len);

        return m_versionInfo.ToString();

这确实返回了版本字符串,并且还从十进制转换为字符串格式,如 1.4.3。

【讨论】:

  • 你在哪里找到合适的字符串来使用?我尝试了“INSTALLPROPERTY_VERSIONSTRING”、“ProductVersion”、“INSTALLPROPERTY_VERSION”以及我能够通过 MSDN 找到的所有其他表示形式,“VersionString”在任何地方都找不到……你在某处找到了实际值的列表吗? TIA
  • 这行得通,但我不知道你为什么使用 VersionString。我在没有星号的情况下做到了,它有效
【解决方案3】:

Application.ProductVersion 为我工作,无需手动调用 WinAPI(我仍在 .Net 1.1 中)

【讨论】:

  • @Erick:我刚刚更新了我的问题。我想这适用于当前的应用程序。
  • 一般情况下,您可以使用 System.Diagnostics 中的 FileVersionInfo: FileVersionInfo oFileVersionInfo = FileVersionInfo.GetVersionInfo(sSomeFileName);字符串 sVersion = oFileVersionInfo.FileVersion;
  • @Erick:在我看来,使用 fileversion 不是一个安全的想法,因为您假设文件将安装在该位置。使用 windows api 会是更好的选择。
猜你喜欢
  • 1970-01-01
  • 2011-09-27
  • 2019-11-05
  • 2017-08-30
  • 1970-01-01
  • 1970-01-01
  • 2013-07-11
  • 2019-07-31
  • 2011-04-26
相关资源
最近更新 更多