Как зарегистрировать типы файлов / расширения с помощью установщика WiX?

Я не нашел явного ответа на этот вопрос в Документации WiX (или Google, в этом отношении). Конечно, я мог бы просто написать соответствующие ключи реестра в HKCR, но я чувствую себя грязно, и я ожидаю, что это будет стандартная задача, которая должна иметь хорошее решение по умолчанию.

Что касается бонусных баллов, я хотел бы знать, как сделать его "безопасным", то есть не перезаписывать существующие регистрации для типа файла и удалять регистрацию при удалении только в том случае, если она была зарегистрирована во время установки и не изменилась.

3 ответа

К сожалению, не существует способа сделать "безопасную" связь с установщиком Windows.

Мы просто записываем все в реестр, а затем имеем отдельный компонент, который принимает общесистемное значение по умолчанию и устанавливается только в том случае, если никакое другое приложение уже не зарегистрировало себя в качестве значения по умолчанию.

В 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>

После некоторых дополнительных исследований я нашел частичный ответ на этот вопрос в Учебном пособии по 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). Это зарегистрирует тип файла в вашем исполняемом файле и предоставит значок по умолчанию (белая страница со значком приложения на нем), что достаточно для моих нужд. Если вы хотите указать выделенный значок, похоже, вам все равно придется сделать это самостоятельно, как показано ниже (код из связанного руководства):

<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 элемента File, описывающего файл, предназначенный для обработки файлов этого файла. расширение. Обратите внимание на восклицательный знак: вместо длинного будет возвращен короткий путь к файлу:"

<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/

Другие вопросы по тегам