0
我想知道是否可以从Windows中检索已安装的应用程序的列表,包括它们的GUID和升级GUID。我在升级到我的某个程序时遇到问题,需要检查旧版本程序的这些值。谢谢您的帮助!Windows GUID或应用程序列表
我想知道是否可以从Windows中检索已安装的应用程序的列表,包括它们的GUID和升级GUID。我在升级到我的某个程序时遇到问题,需要检查旧版本程序的这些值。谢谢您的帮助!Windows GUID或应用程序列表
您可以使用MSI API函数来枚举所有已安装的产品并查询其属性。如果您将MsiGetProductInfo
替换为MsiGetProductInfoEx
,您将能够查询其他信息,例如与安装关联的安装上下文或用户SID。
但是,这不允许您枚举UpgradeCode
。据我所知,MSI没有保留一条记录,将ProductCode
与UpgradeCode
关联;只有反向映射可用,您可以使用MsiEnumRelatedProducts
函数枚举与UpgradeCode
相关的产品。
下面你会发现其中列举了安装或标榜产品及其ProductCode
使用C#示例代码:
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;
class Program
{
[DllImport("msi.dll", CharSet = CharSet.Unicode)]
static extern Int32 MsiGetProductInfo(string product, string property,
[Out] StringBuilder valueBuf, ref Int32 len);
[DllImport("msi.dll", SetLastError = true)]
static extern int MsiEnumProducts(int iProductIndex,
StringBuilder lpProductBuf);
static void Main(string[] args)
{
StringBuilder sbProductCode = new StringBuilder(39);
int iIdx = 0;
while (MsiEnumProducts(iIdx++, sbProductCode) == 0)
{
Int32 productNameLen = 512;
StringBuilder sbProductName = new StringBuilder(productNameLen);
MsiGetProductInfo(sbProductCode.ToString(),
"ProductName", sbProductName, ref productNameLen);
Console.WriteLine("Product: {0}\t{1}", sbProductName, sbProductCode);
}
}
}
更新
如果您仍然有以前版本的MSI安装程序即可只需使用Orca打开文件并搜索UpgradeCode即可。
我当然用Orca打开了MSI,一切都结束了,但我只是想直接用Windows检查,看看在初始安装过程中是否发生了任何奇怪的事情。升级代码是相同的,升级只是不起作用。请参阅http://stackoverflow.com/questions/3863171/wix3-major-upgrade-not-working – Adkins 2010-10-05 12:09:31