2008-09-26 4 views
33

Je n'ai pas trouvé de réponse explicite à cette question dans la Documentation WiX (ou Google, d'ailleurs). Bien sûr, je pourrais juste écrire les clés de registre appropriées dans HKCR, mais cela me fait me sentir sale et je m'attends à ce que ce soit une tâche standard qui devrait avoir une bonne solution par défaut. Pour les points bonus, je voudrais savoir comment le rendre "sûr", c'est à dire ne pas écraser les enregistrements existants pour le type de fichier et supprimer l'enregistrement sur désinstaller seulement s'il a été enregistré pendant l'installation et est inchangé .Comment enregistrer des types de fichiers/extensions avec un installateur WiX?

Répondre

6

"Si votre application gère son propre type de données de fichier, vous devez enregistrer une association de fichier pour elle.Placez un ProgId à l'intérieur de votre composant FileId doit se référer à l'attribut Id de l'élément File décrivant le fichier . les fichiers de cette extension Notez le point d'exclamation: il retourne le chemin court du fichier au lieu de la longue: »

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

Référence: http://wix.tramontana.co.hu/tutorial/getting-started/beyond-files

11

Après quelques recherches, j'ai trouvé un partiel répondez à cette question dans le WiX Tutorial. Il montre une solution annoncée et ne fonctionne pas avec WiX 3.0, mais étant donné cette information, je l'ai compris. Ajouter un élément ProgId le composant contenant l'exécutable, comme suit:

<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 est l'extension de fichier sans le point, et MyApplication.exe est l'identifiant de fichier (nom non) du fichier exécutable (à savoir le Attribut Id de l'élément File). Cela enregistrera le type de fichier avec votre exécutable et fournira une icône par défaut (une page blanche avec l'icône de l'application), ce qui est suffisant pour mes besoins. Si vous souhaitez spécifier une icône dédiée, il semble que vous avez encore à faire vous-même, comme ce qui suit (le code du tutoriel lié):

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

Je ne ai trouvé une bonne solution pour ma question bonus si . Edit: J'ai commencé à écrire ceci avant que la réponse précédente ne vienne. Cependant, ma solution fonctionne réellement, contrairement à la réponse précédente.

+0

Cela ne fonctionne pas. –

+0

@VK: C'est le cas. Qu'est-ce qui ne semble pas fonctionner pour vous? Un code similaire à celui-ci est en production depuis environ 2008 ici et n'a jamais été changé, et cela fonctionne toujours.D'autre part, vous pouvez maintenant utiliser Icon pour une solution annoncée sans avoir à installer le fichier d'icône (ou simplement utiliser File si vous pouvez installer le fichier ou l'avoir dans un fichier exécutable de toute façon). Alors, qu'est-ce qui ne fonctionne pas pour vous ici? – OregonGhost

+0

J'ai utilisé ce code, mais l'application mon n'a pas été définie comme application par défaut. –

19

Malheureusement, il n'existe aucun moyen de faire une association "sûre" avec Windows Installer.

Nous écrivons simplement tout dans le registre, puis nous avons un composant séparé qui prend en charge la valeur par défaut du système et n'est installé que si aucune autre application ne s'est déjà enregistrée par défaut.

Avec Vista, il y a la nouvelle interface "programmes par défaut", encore une fois vous écrivez tout dans le registre. Voici un exemple complet que nous utilisons dans notre installateur. (WiX 3.0)

Mise à jour: 12 mois se sont écoulés depuis ma réponse originale et j'ai une meilleure compréhension des associations de fichiers. Plutôt que d'écrire tout manuellement, j'utilise maintenant les bonnes définitions ProgId qui améliorent la gestion des paquets annoncés. Voir le code mis à jour 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 Ne sommes-nous pas supposés modifier les entrées HKCR plutôt que HKLM pour le mappage de type de fichier? –

+0

XYZ devient-il sensible à la casse? – rolls

Questions connexes