2008-09-26 6 views
33

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

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

ответ

6

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

11

После некоторых дополнительных исследований, я нашел частичное ответьте на этот вопрос в 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 является файл идентификатор (не имя) исполняемого файла (т.е. Идентификатор элемента 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' /> 

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

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

+0

Это не работает. – 2017-06-08 09:26:27

+0

@VK:. Что точно не работает для вас? Код, аналогичный этому, находится в производстве с 2008 года здесь и никогда не менялся, и он все еще работает.С другой стороны, теперь вы можете использовать значок для рекламируемого решения без необходимости установки файла значка (или просто использовать файл, если вы можете установить файл или иметь его в исполняемом файле в любом случае). Итак, что здесь не работает? – OregonGhost 2017-07-27 07:31:58

19

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

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

С Vista появился новый интерфейс «по умолчанию», снова вы все записываете в реестр. Вот полный пример, который мы используем в нашем установщике. (WiX 3.0)

Обновление: Прошло 12 месяцев с момента моего первоначального ответа, и у меня есть лучшее понимание ассоциаций файлов. Вместо того, чтобы писать все вручную, я теперь использую правильные определения ProgId, которые улучшают обработку рекламируемых пакетов. См. Обновленный код posted in response to this question.

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