如何注册与维克斯安装程序的文件类型/扩展?(How to register file types/e

2019-07-05 03:46发布

我没有找到在WiX的文档明确回答这个问题(或谷歌,对于这个问题)。 当然,我可以只写在HKCR相应的注册表项,但它让我觉得脏,我希望这是应该有一个很好的默认解决方案标准的任务。

对于加分,我想知道如何让它“安全”,即不覆盖现有注册的文件类型和删除,只有当它已经在安装时被注册,目前没有改变卸载登记。

Answer 1:

不幸的是没有办法做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="&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>


Answer 2:

经过一番更多的研究,我发现了部分答案在这个问题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(未命名)(即文件元素的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' />

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

编辑:我开始写这篇以前的答案到来之前。 然而,我的解决方案的实际工作,而相比之下,以前的答案。



Answer 3:

“如果你的应用程序处理自己的文件数据类型,你需要为它注册文件关联。把一个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/



文章来源: How to register file types/extensions with a WiX installer?