如果WIX安装程序上未安装软件,如何显示警告并退出

时间:2016-02-24 17:46:39

标签: wix windows-installer installer

我是Wix的新人,让我提供一些关于我想要完成的事情的信息。我有一个软件安装程序" B"但是这个软件需要有软件" A"实际工作。所以我想添加软件安装程序" B"检查软件" A"已安装,如果它不显示消息然后退出安装程序。

以下是我尝试过的代码,但即使文件存在,该消息也会始终显示。所以我基本上都在寻找一个来自软件" A"的文件,如果它存在,那么安装应该正常继续,如果它不是,那么应该显示警告信息并退出安装程序。

 <Property Id="SOFTWARE_A_INSTALLED">
  <DirectorySearch
    Id="LocationFile"
    Path="C:\Windows\Microsoft.NET\assembly\SOFTWAREA">
    <FileSearch Name="A.dll"></FileSearch>
  </DirectorySearch>
</Property>

<Condition Message="[ProductName] requires SOFTWARE A installed.">
  <![CDATA[Installed OR SOFTWARE_A_INSTALLED]]>
</Condition>

由于

1 个答案:

答案 0 :(得分:1)

通常有更好的方法来做到这一点。如果该产品是MSI文件,则使用Upgrade元素检测产品的UpgradeCode,或使用该程序集的组件ID进行组件搜索。或者,该产品可能会创建一个可以搜索的注册表项。

一般情况下,我不推荐您的方法,因为您说您的产品B需要A才能使用。您没有说您的INSTALL需要A才能使安装成功,因此当您实际上只有产品依赖项时,您将创建安装顺序依赖项。那么,如果卸载A,您的产品会怎样做?崩溃?发出任何警告?更好的解决方案可能是您的应用程序进行检查,而不是创建所需的安装顺序。

如果A中的程序集实际上是您的应用程序的依赖项,并且它只是您依赖的几个文件之一,那么它可能应该是可再发行的,可用作合并模块之类的东西。人们不(例如)检查Crystal Reports文件是否在系统上 - 它们只包括包含文件的合并模块,并以系统的多个用户可以共享相同文件的方式安装它们。许多其他共享文件也是如此。

此vbscript将枚举已安装的组件ID,以检查您是否具有组件搜索的正确值:

Option Explicit
Public installer, fullmsg, comp, a, prod, fso, pname, ploc, pid, psorce

    Set fso = CreateObject("Scripting.FileSystemObject")
    Set a = fso.CreateTextFile("comps.txt", True)

    ' Connect to Windows Installer object
    Set installer = CreateObject("WindowsInstaller.Installer")
    a.writeline ("MSI Components")
    on error resume next
    For Each comp In installer.components
       a.writeline (comp & " is used by the product:")
       for each prod in Installer.ComponentClients (comp) 
          pid = installer.componentpath (prod, comp) 
          pname = installer.productinfo (prod, "InstalledProductName")
          a.Writeline ("     " & pname & " " & prod & "and is installed at " & pid)
       Next
    Next