我想在安装期间有条件地设置文件扩展名。据我所知,为了在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=""%1""/>
</Extension>
</ProgId>
</Component>
但是这给了我以下错误:
error LGHT0204: ICE19: Extension: 'ps' advertises component: 'FileAssocComponent_PS'. This component cannot be advertised because the KeyPath type disallows it.
我已经尝试在其中一个注册表项上设置KeyPath =“yes”,但这不起作用 - 并且从我能够找到它期望文件KeyPath。但这是一个不包含任何文件的组件!
我如何解决这个错误,或者我是以错误的方式解决这个问题?
答案 0 :(得分:3)
广告组件需要密钥文件,因此这里有一些解决错误的方法。
1)
为组件提供一个不会损害系统的伪文件(printermimeinstalled.txt)。
2)
将PrinterAppMime.ps作为此组件的密钥文件。使用CopyFile元素将文件复制到PrinterApp.ps
与另一个组件的密钥文件一起编写PrinterAppNoMime.ps(内容相同)。还可以使用CopyFile元素将文件复制到PrinterApp.ps。为此组件提供互斥的组件条件,以便只有1个组件可以获得instaleld。
3)
稍微更改应用的设计。始终安装PrinterApp.ps并有条件地安装PrinterAppMimeServer.ps。
4)
消除此自定义操作并使用自定义操作在安装时创建MSI临时表行,以便在选中该复选框时定义MIME内容。
这四种方法中的每一种都有赞成和反对意见,我个人会选择#3。
答案 1 :(得分:0)
如果设置Advertise="no"
,您应该能够使用您编写的代码。这是我几年前发布的一个示例here,使用单独的组件进行可选的文件关联。
<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>
答案 2 :(得分:0)
我找到了一个适合我的解决方案。我遇到的问题是我对exe扩展的关联有一个条件。如果未选中扩展名以不关联,我需要安装exe组件但没有progid。问题是,如果在组件上放置一个条件,则不会创建progid但是exe也没有安装。我找到的解决方案是两个创建两个组件。一个条件和一个互斥条件。这基本上是Christopher Painters职位的选项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=""%1"" />
<MIME Advertise="yes" ContentType="application/abc" Default="yes" />
</Extension>
</ProgId>
</Component>