2008-09-26 6 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

이것은 작동하지 않습니다. –

+0

@VK : 그렇습니다. 정확히 당신에게 효과가없는 것 같습니까? 이와 비슷한 코드는 2008 년 이래로 생산 중이며 변경되지 않았으며 여전히 작동합니다.반면 아이콘 파일을 설치하지 않고도 (또는 파일을 설치하거나 실행 파일에 저장할 수있는 경우) 파일을 사용하지 않고도 광고 솔루션에 Icon을 사용할 수 있습니다. 그래서, 여기서 당신을 위해 무엇이 효과가 없을까요? – OregonGhost

+0

이 코드를 사용했지만 내 응용 프로그램이 기본 응용 프로그램으로 설정되지 않았습니다. –

19

불행히도 Windows Installer와 "안전한"연결을 수행 할 방법이 없습니다.

레지스트리에 모든 것을 쓰고 시스템 전반의 기본값을 인계하는 별도의 구성 요소가 있으며 다른 응용 프로그램이 이미 기본값으로 등록되어 있지 않은 경우에만 설치됩니다.

비스타에는 새로운 "기본 프로그램"인터페이스가있어서 다시 모든 것을 레지스트리에 씁니다. 다음은 설치 프로그램에서 사용하는 예제입니다. (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> 
+0

@saschabeumont 파일 유형 매핑을 위해 HKLM이 아닌 HKCR 항목을 수정해야하지 않습니까? –

+0

xyz는 대소 문자를 구분합니까? – rolls

관련 문제