Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

К сожалению, нет способа сделать "безопасную" связь с установщиком 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>

Ответ 2

После некоторых дополнительных исследований, я нашел частичный ответ на этот вопрос в

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

Я не нашел хорошего решения для моего бонусного вопроса.

Изменить: я начал писать это до того, как пришел предыдущий ответ. Однако мое решение действительно работает, в отличие от предыдущего ответа.

Ответ 3

"Если ваше приложение обрабатывает свой собственный тип данных файла, вам необходимо зарегистрировать ассоциацию файлов для него. Поместите 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>

Ссылка: http://wix.tramontana.co.hu/tutorial/getting-started/beyond-files