2011-01-31 36 views
3

我想要以编程方式查找基于MSI的安装的安装位置。该应用程序不会在注册表中的卸载密钥中输入“安装位置”。应用程序不会填充ARPINSTALLLOCATION属性。 (这与“添加/删除程序”引用的值相同,并存储在“卸载”键中)。不过,卸载仍然可以找到它的位置,并可以卸载它。这些信息存储在哪里? Windows使用缓存的MSI安装程序来卸载应用程序,但安装位置是在安装时第一次确定的,因此此信息不是安装程序包的一部分。如何以编程方式在Windows中查找安装的应用程序的安装位置

回答

2

我假设你说“安装位置”时,你的意思是“应用程序EXE位于什么目录?”否则,这个问题是不明确的,因为MSI不一定需要安装“应用程序”。它可以安装没有EXE的组件。它可以在多个目录中安装...

但是,这可能会工作:

呼叫MsiGetProductInfo得到ARPINSTALLLOCATION。您需要知道安装的“产品名称”。作为第一参数。呼叫MsiEnumProducts如果需要

+2

与此相关的安装程序对象,当你知道它是一个.msi并且可以在其中找到一个组件时,你可以使用MsiGetComponentPath(或MsiLocateComponent)来定位它的keypath。这可能是正确组件的exe。 –

+0

@迈克尔,这是最终为我工作的。 –

2

下面是一个使用了WindowsInstaller.Installer COM接口一个VBScript版本枚举所有已安装的“产品”:

Dim installer 
Set installer = CreateObject("WindowsInstaller.Installer") 
Dim productCode, productName 
For Each productCode In installer.Products 
    WScript.Echo "ProductCode: " & productCode 
    WScript.Echo "ProductName: " & installer.ProductInfo(productCode, "ProductName") 
    WScript.Echo "InstallLocation: " & installer.ProductInfo(productCode, "InstallLocation") 
    WScript.Echo "LocalPackage: " & installer.ProductInfo(productCode, "LocalPackage") 
Next 

了解更多关于http://msdn.microsoft.com/en-us/library/windows/desktop/aa369432(v=vs.85).aspx#methods

相关问题