Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Installation 如何向WiX安装程序注册文件类型/扩展名?_Installation_Wix_Windows Installer_Wix3 - Fatal编程技术网

Installation 如何向WiX安装程序注册文件类型/扩展名?

Installation 如何向WiX安装程序注册文件类型/扩展名?,installation,wix,windows-installer,wix3,Installation,Wix,Windows Installer,Wix3,我在WiX文档(或谷歌文档)中没有找到这个问题的明确答案。当然,我可以在HKCR中编写适当的注册表项,但这会让我感觉脏兮兮的,我希望这是一个标准任务,应该有一个很好的默认解决方案 对于额外的积分,我想知道如何使其“安全”,即不覆盖文件类型的现有注册,只有在安装过程中已注册且未更改的情况下,才在卸载时删除注册。“如果应用程序处理自己的文件数据类型,则需要为其注册文件关联。在组件中放置一个ProgId。FileId应该引用File元素的Id属性,该属性描述用于处理此扩展名文件的文件。请注意感叹号:它

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

对于额外的积分,我想知道如何使其“安全”,即不覆盖文件类型的现有注册,只有在安装过程中已注册且未更改的情况下,才在卸载时删除注册。

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



参考资料:

经过一些额外的研究,我在中找到了这个问题的部分答案。它显示了一个公布的解决方案,不适用于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>

MyText是不带点的文件扩展名,MyApplication.exe是可执行文件的文件id(而不是名称)(即文件元素的id属性)。 这将向您的可执行文件注册文件类型,并提供一个默认图标(一个带有应用程序图标的白色页面),这足以满足我的需要。如果您想指定一个专用图标,您似乎仍需要自己完成此操作,如下所示(链接教程中的代码):


不过,我并没有找到解决奖金问题的好办法


编辑:我在上一个答案出现之前就开始写这篇文章。然而,与上一个答案相比,我的解决方案实际上是可行的。

不幸的是,没有办法与Windows Installer进行“安全”关联

我们只需将所有内容写入注册表,然后有一个单独的组件来接管系统范围内的默认值,并且只有在没有其他应用程序已经将自己注册为默认值的情况下才能安装该组件

Vista有了新的“默认程序”界面,您可以再次将所有内容写入注册表。下面是我们在安装程序中使用的完整示例。(WiX 3.0)

更新:12个月过去了,我对文件关联有了更好的理解。我现在使用正确的
ProgId
定义,而不是手动编写所有内容,从而改进了对广告包的处理。请参阅更新的代码



@saschabeumont难道我们不应该修改HKCR条目而不是HKLM来进行文件类型映射吗?xyz是否区分大小写?如果您想为同一个应用程序拥有多个文件扩展名,该怎么办?对于将
ProgId
作为其子元素的组件,
应该是什么?keypath会是什么“对于组件be?@VK:是的。到底什么似乎对你不起作用?类似于此的代码自2008年左右开始在这里生产,从未更改过,并且仍然有效。另一方面,您现在可以为公布的解决方案使用图标,而无需安装图标文件(或者,如果您可以安装该文件或将其保存在可执行文件中,则只需使用该文件)。那么,这里有什么不适合您呢?我使用了这段代码,但是我的应用程序没有设置为默认应用程序。这与设置默认应用程序不相混淆,它只为某个文件类型注册一个打开谓词,并且只有在没有其他文件类型已注册的情况下才会成为默认值。你需要更具体地说明你想要实现什么。你可能还想看看saschabeaumont用广告链接的答案。
<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>
<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' />
<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>