如何使用WiX安装程序注册文件类型/扩展名?
在WiX文档(或者Google)中,我没有找到该问题的明确答案。当然,我可以只在HKCR中编写适当的注册表项,但这会让我感到肮脏,我希望这是一个标准任务,应该有一个不错的默认解决方案。
为了获得加分,我想知道如何使其"安全",即,仅在安装过程中已注册且未更改的情况下,才不要覆盖文件类型的现有注册并在卸载时删除该注册。
解决方案
"如果应用程序处理自己的文件数据类型,则需要为其注册一个文件关联。将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
经过一些额外的研究,我在WiX教程中找到了对该问题的部分答案。它显示了一个公告的解决方案,并且不能与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(不是名称)(即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' />
不过,对于我的奖金问题,我找不到很好的解决方案。
编辑:在上一个答案出现之前,我开始写这篇文章。但是,与先前的答案相反,我的解决方案实际上有效。
不幸的是,无法与Windows Installer建立"安全"关联。
我们只是将所有内容写到注册表中,然后有一个单独的组件来接管系统范围的默认值,并且仅当没有其他应用程序将其自身注册为默认值时才安装该组件。
借助Vista,有了新的"默认程序"界面,再次将所有内容写到注册表中。这是我们在安装程序中使用的完整示例。 (WiX 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>