2008-09-26 43 views
33

我没有在WiX文档(或Google上)找到这个问题的明确答案。当然,我可以在HKCR中编写相应的注册表项,但这会让我觉得很肮脏,我认为这是一个标准任务,应该有一个很好的默认解决方案。如何使用WiX安装程序注册文件类型/扩展名?

对于奖励积分,我想知道如何使其“安全”,即不要覆盖文件类型的现有注册,并且只有在安装过程中注册时才会删除注册, 。

回答

6

“如果你的应用程序处理自己的文件数据类型,你需要为它注册一个文件关联,在你的组件中放一个ProgId,FileId应该引用File元素的Id属性来描述文件, 。这个扩展的文件注意感叹号:它会返回文件,而不是长一短的路径:”

<ProgId Id='AcmeFoobar.xyzfile' Description='Acme Foobar data file'> 
    <Extension Id='xyz' ContentType='application/xyz'> 
    <Verb Id='open' Sequence='10' Command='Open' Target='[!FileId]' Argument='"%1"' /> 
    </Extension> 
</ProgId> 

参考:http://wix.tramontana.co.hu/tutorial/getting-started/beyond-files

11

经过一些额外的研究,我发现了一个局部回答这个问题在WiX Tutorial。它显示了一个广告的解决方案,并不适用于WiX 3.0,但给出了这些信息,我找到了答案。一个ProgID元素添加到组件包含您的可执行文件,如下所示:

<ProgId Id="MyApplication.MyFile" Description="My file type"> 
    <Extension Id="myext" ContentType="application/whatever"> 
    <Verb Id="open" Command="open" TargetFile="MyApplication.exe" Argument="&quot;%1&quot;"/> 
    </Extension> 
</ProgId> 

myext是不点的文件扩展名,MyApplication.exe是可执行文件的文件ID(未命名)(即File元素的Id属性)。 这将注册您的可执行文件类型,并会提供一个默认的图标,这足以满足我的需要(与它的应用程序图标白页)。如果要指定一个专门的图标,看来你还是得自己做,这样(代码链接的教程):

<Registry Id='FooIcon1' Root='HKCR' Key='.xyz' Action='write' Type='string' Value='AcmeFoobar.xyzfile' /> 
<Registry Id='FooIcon2' Root='HKCR' Key='AcmeFoobar.xyzfile' Action='write' Type='string' Value='Acme Foobar data file' /> 
<Registry Id='FooIcon3' Root='HKCR' Key='AcmeFoobar.xyzfile\DefaultIcon' Action='write' Type='string' Value='[INSTALLDIR]Foobar.exe,1' /> 

我没有找到我的奖金问题一个很好的解决方案,虽然。

编辑:我开始以前的答案之前写这来了。但是,我的解决方案实际上起作用,与之前的答案相反。

+0

这是行不通的。 – 2017-06-08 09:26:27

+0

@VK:确实如此。什么似乎不适合你?类似于此的代码自2008年左右开始生产,并且从未更改,并且仍然有效。另一方面,您现在可以使用Icon作为广告解决方案,而无需安装图标文件(或者,如果您可以安装该文件或将其放入可执行文件中,则只需使用File)。那么,这里有什么不适合你? – OregonGhost 2017-07-27 07:31:58

19

遗憾的是没有办法做Windows安装一个“安全”的关联。

我们只是写东西展现出来注册表,然后有一个单独的组件,它接管系统默认,如果没有其他的应用程序已经自身注册为默认只安装。

在Vista中有一个新的“默认程序”界面,再你写的所有的东西到注册表中。以下是我们在安装程序中使用的完整示例。 (WiX 3.0)

更新:自我原来的答案已经过了12个月,我对文件关联有了更好的理解。我不是手动编写所有的东西,而是现在使用适当的ProgId定义,这可以改进广告软件包的处理。查看更新代码posted in response to this question

<Component ....> 
    <RegistryValue Root="HKLM" Key="SOFTWARE\AcmeFoobar\Capabilities" Name="ApplicationDescription" Value="ACME Foobar XYZ Editor" Type="string" /> 
    <RegistryValue Root="HKLM" Key="SOFTWARE\AcmeFoobar\Capabilities" Name="ApplicationIcon" Value="[APPLICATIONFOLDER]AcmeFoobar.exe,0" Type="string" /> 
    <RegistryValue Root="HKLM" Key="SOFTWARE\AcmeFoobar\Capabilities" Name="ApplicationName" Value="ACME Foobar" Type="string" /> 
    <RegistryValue Root="HKLM" Key="SOFTWARE\AcmeFoobar\Capabilities\DefaultIcon" Value="[APPLICATIONFOLDER]AcmeFoobar.exe,1" Type="string" /> 
    <RegistryValue Root="HKLM" Key="SOFTWARE\AcmeFoobar\Capabilities\FileAssociations" Name=".xyz" Value="AcmeFoobar.Document" Type="string" /> 
    <RegistryValue Root="HKLM" Key="SOFTWARE\AcmeFoobar\Capabilities\MIMEAssociations" Name="application/xyz" Value="AcmeFoobar.Document" Type="string" /> 
    <RegistryValue Root="HKLM" Key="SOFTWARE\AcmeFoobar\Capabilities\shell\Open\command" Value="&quot;[APPLICATIONFOLDER]AcmeFoobar.exe&quot; &quot;%1&quot;" Type="string" /> 

    <RegistryValue Root="HKLM" Key="SOFTWARE\RegisteredApplications" Name="Acme Foobar" Value="SOFTWARE\AcmeFoobar\Capabilities" Type="string" /> 

    <RegistryValue Root="HKLM" Key="SOFTWARE\Classes\.xyz" Name="Content Type" Value="application/xyz" Type="string" /> 
    <RegistryValue Root="HKLM" Key="SOFTWARE\Classes\.xyz\AcmeFoobar.Document\ShellNew" Value="" Type="string" /> 
    <RegistryValue Root="HKLM" Key="SOFTWARE\Classes\.xyz\OpenWithList\AcmeFoobar.exe" Value="" Type="string" /> 
    <RegistryValue Root="HKLM" Key="SOFTWARE\Classes\.xyz\OpenWithProgids" Name="AcmeFoobar.Document" Value="" Type="string" /> 
    <RegistryValue Root="HKLM" Key="SOFTWARE\Classes\Applications\AcmeFoobar.exe\SupportedTypes" Name=".xyz" Value="" Type="string" /> 
    <RegistryValue Root="HKLM" Key="SOFTWARE\Classes\Applications\AcmeFoobar.exe\shell\open" Name="FriendlyAppName" Value="ACME Foobar" Type="string" /> 

    <RegistryValue Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\AcmeFoobar.exe" Value="[!AcmeFoobar.exe]" Type="string" /> 
    <RegistryValue Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\AcmeFoobar.exe" Name="Path" Value="[APPLICATIONFOLDER]" Type="string" /> 

    <RegistryValue Root="HKLM" Key="SOFTWARE\Classes\SystemFileAssociations\.xyz\shell\edit.AcmeFoobar.exe" Value="Edit with ACME Foobar" Type="string" /> 
    <RegistryValue Root="HKLM" Key="SOFTWARE\Classes\SystemFileAssociations\.xyz\shell\edit.AcmeFoobar.exe\command" Value="&quot;[APPLICATIONFOLDER]AcmeFoobar.exe&quot; &quot;%1&quot;" Type="string" /> 

</Component> 



<Component ....> 
    <ProgId Id="AcmeFoobar.Document" Description="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> 
相关问题