Installation 如何使用Wix有条件地设置文件扩展名?

Installation 如何使用Wix有条件地设置文件扩展名?,installation,wix,windows-installer,Installation,Wix,Windows Installer,我想在安装过程中有条件地设置文件扩展名。据我所知,为了在Wix中有条件地执行任何操作,它应该是一个自包含的组件。因此,对于我希望允许用户设置的每个文件类型关联,我有一个类似于以下内容的组件: <Component Id="FileAssocComponent_PS" Guid="DAFE9461-2DF0-934A-F204-6B28CEA23C01"> <Condition>FILE_ASSOC_PS</Condition> <Registry

我想在安装过程中有条件地设置文件扩展名。据我所知,为了在Wix中有条件地执行任何操作,它应该是一个自包含的组件。因此,对于我希望允许用户设置的每个文件类型关联,我有一个类似于以下内容的组件:

<Component Id="FileAssocComponent_PS" Guid="DAFE9461-2DF0-934A-F204-6B28CEA23C01">
  <Condition>FILE_ASSOC_PS</Condition>
  <RegistryValue Root="HKLM" Key="SOFTWARE\PrinterApp\Capabilities\FileAssociations" Name=".prn" Value="PrinterApp.ps" Type="string" />
  <RegistryValue Root="HKLM" Key="SOFTWARE\PrinterApp\Capabilities\MIMEAssociations" Name="application/postscript" Value="PrinterApp.ps" Type="string" />
  <RegistryValue Root="HKLM" Key="SOFTWARE\Classes\PrinterApp.ps" Name="FriendlyTypeName" Value="PostScript File" Type="string" />
  <ProgId Id="PrinterApp.ps" Description="PostScript File" Icon="PrinterApp.ico" Advertise="yes">
    <Extension Id="ps">
      <Verb Id="open" Command="Open" Argument="&quot;%1&quot;"/>
    </Extension>
  </ProgId>
</Component>

档案助理
但这给了我以下错误:

错误LGHT0204:ICE19:扩展名:“ps”播发组件:“FileAssocComponent\u ps”。无法播发此组件,因为密钥路径类型不允许它。

我试着在其中一个注册表项上设置KeyPath=“yes”,但这不起作用——从我所能找到的情况来看,它需要一个文件KeyPath。但这是一个不包含任何文件的组件


我该如何避免这个错误,还是我的做法不对?

广告组件需要一个密钥文件,所以这里有一些解决这个错误的方法

(一)

为组件提供一个不会损害系统的假文件(printermineminstalled.txt)

(二)

编写PrinterAppMime.ps作为此组件的密钥文件。使用CopyFile元素将文件复制到PrinterApp.ps

编写PrinterAppNoMime.ps(与其他组件的密钥文件内容相同)。还可以使用CopyFile元素将文件复制到PrinterApp.ps。给这个组件一个互斥的组件条件,这样只有一个组件会稳定

(三)

稍微更改一下应用程序的设计。始终安装PrinterApp.ps,并有条件地安装PrinterAppMimeServer.ps

(四)

取消此自定义操作,如果选中此复选框,则使用自定义操作在installtime编写MSI temp表行以定义MIME内容


这4种方法各有利弊,我个人会选择#3

播发的组件需要一个密钥文件,因此这里有一些解决错误的方法

(一)

为组件提供一个不会损害系统的假文件(printermineminstalled.txt)

(二)

编写PrinterAppMime.ps作为此组件的密钥文件。使用CopyFile元素将文件复制到PrinterApp.ps

编写PrinterAppNoMime.ps(与其他组件的密钥文件内容相同)。还可以使用CopyFile元素将文件复制到PrinterApp.ps。给这个组件一个互斥的组件条件,这样只有一个组件会稳定

(三)

稍微更改一下应用程序的设计。始终安装PrinterApp.ps,并有条件地安装PrinterAppMimeServer.ps

(四)

取消此自定义操作,如果选中此复选框,则使用自定义操作在installtime编写MSI temp表行以定义MIME内容


这4种方法各有利弊,我个人会选择#3

如果设置了
advision=“no”
,您应该能够使用您编写的代码。这是我几年前发布的一个示例,它使用一个单独的组件进行可选的文件关联

<Component ....>
    <ProgId Id="AcmeFoobar.Document" hDescription="ACME XYZ Document">
        <Extension Id="pdf" ContentType="application/xyz">
            <Verb Id="open" Command="Open" TargetFile="[APPLICATIONFOLDER]AcmeFoobar.exe" Argument="%1" />
        </Extension>
    </ProgId>

    <Condition><![CDATA[DEFAULTVIEWER=1]]></Condition>
</Component>

如果您设置了
advershing=“no”
,您应该能够使用您编写的代码。这是我几年前发布的一个示例,它使用一个单独的组件进行可选的文件关联

<Component ....>
    <ProgId Id="AcmeFoobar.Document" hDescription="ACME XYZ Document">
        <Extension Id="pdf" ContentType="application/xyz">
            <Verb Id="open" Command="Open" TargetFile="[APPLICATIONFOLDER]AcmeFoobar.exe" Argument="%1" />
        </Extension>
    </ProgId>

    <Condition><![CDATA[DEFAULTVIEWER=1]]></Condition>
</Component>

我找到了一个适合我的解决方案。我遇到的问题是,我对exe的扩展关联有一个条件。如果未选中扩展以不关联,则需要安装exe组件,但不需要progid。问题是,如果在组件上设置条件,则不会创建progid,但也不会安装exe。我找到的解决方案是创建两个组件。一个具有条件,另一个具有相互排斥的条件。这基本上是Christopher Painters post的选项2

见下文:

<Component Id="My.exe" Guid="{D9CF6FDD-1234-4E90-85A1-3BF1F912C1E3}">
   <Condition>NOT FILES_ASSOCIATIONS_ABC</Condition>
    <File Id="My.exe.without_assoc" Name="My.exe" KeyPath="yes" Vital="yes" Compressed="yes" DiskId="1" Source=".\SourceDir\My.exe" />
  </Component>
  <Component Id="My.exe_assoc" Guid="{07F96643-5D74-1234-9DAE-CDEB5AC2D11E}">
    <File Id="My.exe.with_assoc" Name="My.exe" KeyPath="yes" Vital="yes" Compressed="yes" DiskId="1" Source=".\SourceDir\My.exe" />
    <Condition>FILES_ASSOCIATIONS_ABC</Condition>
    <ProgId Id="My.Document" Description="My exe" Icon="MyIcon" Advertise="yes">
      <Extension Id="abc">
        <Verb Id="open" Command="My Exe" Argument="&quot;%1&quot;" />
        <MIME Advertise="yes" ContentType="application/abc" Default="yes" />
      </Extension>
    </ProgId>
  </Component>

不是文件\u协会\u ABC
文件\协会\ ABC

我找到了一个适合我的解决方案。我遇到的问题是,我对exe的扩展关联有一个条件。如果未选中扩展以不关联,则需要安装exe组件,但不需要progid。问题是,如果在组件上设置条件,则不会创建progid,但也不会安装exe。我找到的解决方案是创建两个组件。一个具有条件,另一个具有相互排斥的条件。这基本上是Christopher Painters post的选项2

见下文:

<Component Id="My.exe" Guid="{D9CF6FDD-1234-4E90-85A1-3BF1F912C1E3}">
   <Condition>NOT FILES_ASSOCIATIONS_ABC</Condition>
    <File Id="My.exe.without_assoc" Name="My.exe" KeyPath="yes" Vital="yes" Compressed="yes" DiskId="1" Source=".\SourceDir\My.exe" />
  </Component>
  <Component Id="My.exe_assoc" Guid="{07F96643-5D74-1234-9DAE-CDEB5AC2D11E}">
    <File Id="My.exe.with_assoc" Name="My.exe" KeyPath="yes" Vital="yes" Compressed="yes" DiskId="1" Source=".\SourceDir\My.exe" />
    <Condition>FILES_ASSOCIATIONS_ABC</Condition>
    <ProgId Id="My.Document" Description="My exe" Icon="MyIcon" Advertise="yes">
      <Extension Id="abc">
        <Verb Id="open" Command="My Exe" Argument="&quot;%1&quot;" />
        <MIME Advertise="yes" ContentType="application/abc" Default="yes" />
      </Extension>
    </ProgId>
  </Component>

不是文件\u协会\u ABC
文件\协会\ ABC