使用 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 API一日一练 83 GetModuleFileName函数
在 Windows - API - 如何获取/使用当前用户权限(或单点登录)