2008-09-26 33 views
33

Tôi không tìm thấy câu trả lời rõ ràng cho câu hỏi này trong Tài liệu WiX (hoặc Google, cho vấn đề đó). Tất nhiên tôi chỉ có thể viết các khóa registry thích hợp trong HKCR, nhưng nó làm cho tôi cảm thấy dơ bẩn và tôi mong đợi đây là một nhiệm vụ tiêu chuẩn cần phải có một giải pháp mặc định tốt đẹp.Làm cách nào để đăng ký loại tệp/tiện ích mở rộng bằng trình cài đặt WiX?

Đối với điểm thưởng, tôi muốn biết cách làm cho "an toàn", nghĩa là không ghi đè đăng ký hiện tại cho loại tệp và xóa đăng ký khi gỡ cài đặt chỉ khi đã đăng ký trong khi cài đặt và không thay đổi .

Trả lời

6

"Nếu ứng dụng của bạn xử lý loại dữ liệu tệp riêng, bạn sẽ cần phải đăng ký một liên kết tệp cho nó. Đặt một ProgId bên trong thành phần của bạn. FileId nên tham chiếu đến thuộc tính Id của phần tử Tệp mô tả tệp có nghĩa là để xử lý . các tập tin của phần mở rộng này Lưu ý các dấu chấm than: nó sẽ trở lại con đường ngắn của tập tin thay vì dài một:"

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

tham khảo: http://wix.tramontana.co.hu/tutorial/getting-started/beyond-files

11

Sau khi một số nghiên cứu bổ sung, tôi tìm thấy một phần trả lời cho câu hỏi này trong WiX Tutorial. Nó cho thấy một giải pháp được quảng cáo và không hoạt động với WiX 3.0, nhưng với thông tin đó, tôi đã tìm ra nó. Thêm một yếu tố ProgID với thành phần chứa thực thi của bạn, giống như sau:

<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 là phần mở rộng tập tin mà không có dấu chấm, và MyApplication.exe là id tập tin (không nêu tên) của tập tin thực thi (tức là Thuộc tính Id của phần tử Tệp). Điều này sẽ đăng ký loại tệp với tệp thi hành của bạn và sẽ cung cấp biểu tượng mặc định (một trang trắng có biểu tượng ứng dụng trên đó), đủ cho nhu cầu của tôi. Nếu bạn muốn chỉ định một biểu tượng dành riêng, có vẻ như bạn vẫn phải làm điều này cho mình, như sau (mã từ các hướng dẫn liên kết):

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

tôi không tìm thấy một giải pháp tốt cho vấn đề tiền thưởng của tôi mặc dù .

Chỉnh sửa: Tôi bắt đầu viết thư này trước khi câu trả lời trước đến. Tuy nhiên, giải pháp của tôi thực sự hoạt động, trái ngược với câu trả lời trước đó.

+0

Điều này không có tác dụng. –

+0

@VK: Đúng vậy. Chính xác những gì dường như không có tác dụng với bạn? Mã số tương tự như thế này được sản xuất kể từ khoảng năm 2008 ở đây và không bao giờ thay đổi, và nó vẫn hoạt động.Mặt khác, bây giờ bạn có thể sử dụng Icon cho giải pháp được quảng cáo mà không phải cài đặt tệp biểu tượng (hoặc chỉ sử dụng Tệp nếu bạn có thể cài đặt tệp hoặc có tệp trong tệp thi hành). Vì vậy, những gì không làm việc cho bạn ở đây? – OregonGhost

+0

Tôi đã sử dụng mã này nhưng ứng dụng của tôi không được đặt làm ứng dụng mặc định. –

19

Rất tiếc, không có cách nào để thực hiện liên kết "an toàn" với Trình cài đặt Windows.

Chúng tôi chỉ ghi mọi thứ vào sổ đăng ký và sau đó có một thành phần riêng biệt chiếm toàn bộ mặc định toàn hệ thống và chỉ được cài đặt nếu không ứng dụng nào khác đã đăng ký chính nó làm mặc định.

Với Vista có giao diện "chương trình mặc định" mới, một lần nữa bạn ghi mọi thứ ra khỏi sổ đăng ký. Dưới đây là một ví dụ hoàn chỉnh mà chúng tôi đang sử dụng trong trình cài đặt của chúng tôi. (WiX 3.0)

Cập nhật: 12 tháng đã trôi qua kể từ câu trả lời ban đầu của tôi và tôi hiểu rõ hơn về các liên kết tệp. Thay vì viết mọi thứ theo cách thủ công, tôi hiện đang sử dụng các định nghĩa thích hợp ProgId để cải thiện việc xử lý các gói được quảng cáo. Xem mã được cập nhật 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 Chúng ta không phải sửa đổi các mục HKCR thay vì HKLM để ánh xạ kiểu tệp? –

+0

không xyz trở thành trường hợp nhạy cảm? – rolls

Các vấn đề liên quan