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

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

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

Ответы [ 3 ]

19 голосов
/ 26 мая 2009

К сожалению, нет способа сделать «безопасную» связь с установщиком 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>
12 голосов
/ 26 сентября 2008

После некоторых дополнительных исследований я нашел частичный ответ на этот вопрос в WiX Tutorial . Он показывает рекламируемое решение и не работает с 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' />

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

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

8 голосов
/ 26 сентября 2008

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

...