使用 windows api 读取应用程序的当前安装版本

Posted

技术标签:

【中文标题】使用 windows api 读取应用程序的当前安装版本【英文标题】:Reading current installed version of an application using 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指出,下次我会记住的。 【参考方案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 会是更好的选择。

以上是关于使用 windows api 读取应用程序的当前安装版本的主要内容,如果未能解决你的问题,请参考以下文章

Windows 安全弹出窗口出现在主应用程序窗口后面

Windows有没有提供无视权限读取文件的api

Windows API一日一练 83 GetModuleFileName函数

在 Windows - API - 如何获取/使用当前用户权限(或单点登录)

.NET 与 Windows RT 蓝牙 LE API - 重新启动 Windows 后无法读取或写入设备

Python 如何获得一个Windows程序窗口,并在窗口里的当前