2008-09-26 15 views
33

No encontré una respuesta explícita a esta pregunta en la Documentación de WiX (o Google, para el caso). Por supuesto, podría simplemente escribir las claves de registro apropiadas en HKCR, pero me hace sentir sucio y espero que esta sea una tarea estándar que debería tener una buena solución predeterminada.¿Cómo registrar tipos de archivos/extensiones con un instalador de WiX?

Para obtener puntos adicionales, me gustaría saber cómo hacerlo "seguro", es decir, no sobrescribir los registros existentes para el tipo de archivo y eliminar el registro en la desinstalación solo si se ha registrado durante la instalación y no se modifica .

Respuesta

6

"Si su aplicación maneja su propio tipo de datos, tendrá que registrar una asociación de archivos para ello. Ponga un ProgId dentro de su componente. FileId debe referirse al atributo Id del elemento File que describe el archivo destinado a manejar . los archivos de esta extensión Nota el signo de exclamación: se devolverá el camino corto del archivo en lugar de la larga:"

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

Referencia: http://wix.tramontana.co.hu/tutorial/getting-started/beyond-files

11

Después de una investigación adicional, me encontré con un parcial Responda a esta pregunta en el WiX Tutorial. Muestra una solución anunciada y no funciona con WiX 3.0, pero dada esa información, lo descubrí. Añadir un elemento ProgId al componente que contiene el ejecutable, como las siguientes:

<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 es la extensión de archivo sin el punto, y MyApplication.exe es el identificador de archivo (no nombre) del archivo ejecutable (es decir, el Id atributo del elemento de archivo). Esto registrará el tipo de archivo con su ejecutable y proporcionará un ícono predeterminado (una página blanca con el icono de la aplicación en él), que es suficiente para mis necesidades. Si desea especificar un icono dedicado, parece que todavía tiene que hacer esto por sí mismo, como el siguiente (código del tutorial vinculado):

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

no he encontrado una buena solución para mi pregunta extra, aunque .

Editar: Empecé a escribir esto antes de que llegara la respuesta anterior. Sin embargo, mi solución realmente funciona, en contraste con la respuesta anterior.

+0

Esto no funciona. –

+0

@VK: Sí. ¿Qué es exactamente lo que no parece funcionar para ti? El código similar está en producción desde 2008 aquí y nunca fue cambiado, y todavía funciona.Por otro lado, ahora puede usar Icon para una solución anunciada sin tener que instalar el archivo de icono (o simplemente use File si puede instalar el archivo o tenerlo en un ejecutable de todos modos). Entonces, ¿qué no funciona para ti aquí? – OregonGhost

+0

Utilicé este código, pero mi aplicación no estaba configurada como aplicación predeterminada. –

19

Desafortunadamente no hay forma de hacer una asociación "segura" con Windows Installer.

Simplemente escribimos todo en el registro y luego tenemos un componente separado que se encarga de la configuración predeterminada del sistema y solo se instala si ninguna otra aplicación ya se ha registrado como la predeterminada.

Con Vista existe la nueva interfaz de "programas por defecto", de nuevo escribe todo en el registro. Aquí hay un ejemplo completo que estamos usando en nuestro instalador. (WiX 3.0)

Actualización: Han pasado 12 meses desde mi respuesta original y tengo una mejor comprensión de las asociaciones de archivos. En lugar de escribir todo manualmente, ahora estoy usando las definiciones adecuadas ProgId que mejoran el manejo de los paquetes anunciados. Vea el código actualizado 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> 
+0

@saschabeumont ¿No se supone que debemos modificar las entradas de HKCR en lugar de HKLM para el mapeo de tipos de archivos? –

+0

¿xyz se distingue entre mayúsculas y minúsculas? – rolls

Cuestiones relacionadas