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