41

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

对于奖励积分,我想知道如何使其“安全”,即不要覆盖文件类型的现有注册,并且只有在安装期间注册并且未更改时才在卸载时删除注册。

4

3 回答 3

20

不幸的是,没有办法与 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="&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>
于 2009-05-26T07:15:19.547 回答
13

经过一些额外的研究,我在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="&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' />

不过,我没有为我的奖金问题找到一个好的解决方案。

编辑:我在上一个答案出现之前就开始写这个了。但是,与之前的答案相比,我的解决方案实际上有效。

于 2008-09-26T12:36:56.010 回答
8

“如果您的应用程序处理自己的文件数据类型,则需要为其注册文件关联。将 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>

参考:https ://www.firegiant.com/wix/tutorial/getting-started/beyond-files/

于 2008-09-26T12:34:07.967 回答