我没有找到在WiX的文档明确回答这个问题(或谷歌,对于这个问题)。 当然,我可以只写在HKCR相应的注册表项,但它让我觉得脏,我希望这是应该有一个很好的默认解决方案标准的任务。
对于加分,我想知道如何让它“安全”,即不覆盖现有注册的文件类型和删除,只有当它已经在安装时被注册,目前没有改变卸载登记。
我没有找到在WiX的文档明确回答这个问题(或谷歌,对于这个问题)。 当然,我可以只写在HKCR相应的注册表项,但它让我觉得脏,我希望这是应该有一个很好的默认解决方案标准的任务。
对于加分,我想知道如何让它“安全”,即不覆盖现有注册的文件类型和删除,只有当它已经在安装时被注册,目前没有改变卸载登记。
不幸的是没有办法做Windows安装一个“安全”的关联。
我们只是把什么都写了注册表,然后有一个单独的组件,它接管系统默认,如果没有其他的应用程序已经自身注册为默认只安装。
在Vista中有一个新的“默认程序”界面,再你写的所有的东西到注册表中。 下面是我们使用我们的安装程序,一个完整的例子。 (维克斯3.0)
更新:因为我原来的答复的12个月过去了,我有一个更好的了解文件关联。 而不是手动写的一切,我现在使用正确的ProgId
定义,从而改进处理的广告套餐。 请参阅更新的代码张贴在回答这个问题 。
<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=""[APPLICATIONFOLDER]AcmeFoobar.exe" "%1"" 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=""[APPLICATIONFOLDER]AcmeFoobar.exe" "%1"" 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>
经过一番更多的研究,我发现了部分答案在这个问题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=""%1""/>
</Extension>
</ProgId>
myext是不点的文件扩展名,MyApplication.exe是可执行文件的文件ID(未命名)(即文件元素的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' />
我没有找到我的奖金问题一个很好的解决方案,但。
编辑:我开始写这篇以前的答案到来之前。 然而,我的解决方案的实际工作,而相比之下,以前的答案。
“如果你的应用程序处理自己的文件数据类型,你需要为它注册文件关联。把一个ProgID您的组件中。FILEID应该是指描述的意思来处理这个文件的文件的文件元素的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>
参考: https://www.firegiant.com/wix/tutorial/getting-started/beyond-files/