2008-09-26 63 views
33

我沒有在WiX文檔(或Google上)找到這個問題的明確答案。當然,我可以在HKCR中編寫相應的註冊表項,但這會讓我覺得很骯髒,我認爲這是一個標準任務,應該有一個很好的默認解決方案。如何使用WiX安裝程序註冊文件類型/擴展名?

對於獎勵積分,我想知道如何使其「安全」,即不要覆蓋文件類型的現有註冊,並且只有在安裝過程中註冊時纔會刪除註冊, 。

回答

6

「如果你的應用程序處理自己的文件數據類型,你需要爲它註冊一個文件關聯,在你的組件中放一個ProgId,FileId應該引用File元素的Id屬性來描述文件, 。這個擴展的文件注意感嘆號:它會返回文件,而不是長一短的路徑:」

<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是可執行文件的文件ID(未命名)(即File元素的Id屬性)。 這將註冊您的可執行文件類型,並會提供一個默認的圖標,這足以滿足我的需要(與它的應用程序圖標白頁)。如果要指定一個專門的圖標,看來你還是得自己做,這樣(代碼鏈接的教程):

<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年左右開始生產,並且從未更改,並且仍然有效。另一方面,您現在可以使用Icon作爲廣告解決方案,而無需安裝圖標文件(或者,如果您可以安裝該文件或將其放入可執行文件中,則只需使用File)。那麼,這裏有什麼不適合你? – 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> 
相關問題