Wix는 모든 사용자 / 컴퓨터 당 광고되지 않은 바로 가기 생성


81

WIX에서 allusers 프로필에 광고되지 않은 바로 가기를 만드는 방법은 무엇입니까? 지금까지 광고 된 바로 가기로 만이 작업을 수행 할 수있었습니다. 바로 가기의 속성으로 이동하여 "대상 찾기"를 사용할 수 있으므로 광고되지 않은 바로 가기를 선호합니다.

자습서에서 바로 가기의 키 경로에 레지스트리 값을 사용하는 것을 보았습니다. 문제는 HKCU를 루트로 사용한다는 것입니다. HKCU를 사용하고 다른 사용자가 프로그램을 제거하면 (모든 사용자 용으로 설치되었으므로) 레지스트리 키가 남습니다. HKMU를 루트로 사용하면 ICE57 오류가 발생하지만 다른 사용자가 프로그램을 제거하면 키가 제거됩니다. HKMU가 올바르게 작동하는 것처럼 보이지만 HKCU를 사용하는쪽으로 밀려 난 것 같습니다 (사용자 별 대 모든 사용자).

광고되지 않은 바로 가기를 만들려고 할 때 ICE38, ICE43 또는 ICE 57과 같은 다양한 ICE 오류가 발생합니다. 내가 본 대부분의 기사는 "얼음 오류를 무시하십시오"를 권장합니다. ICE 오류를 생성하지 않고 광고되지 않은 바로 가기를 생성하는 방법이 있어야합니다.

작동하는 예제에 대한 샘플 코드를 게시하십시오.

답변:


113

내 질문에 대답하는 것이 나쁜 에티켓이라면 미안합니다.

최근에 DISABLEADVTSHORTCUTS 속성 에 대한 정보를 발견했습니다 . 광고 된 바로 가기를 사용하여 설치를 만들고 DISABLEADVTSHORTCUTS 속성을 1로 설정하여 광고되지 않은 바로 가기를 생성했습니다. 이는 공지 된 바로 가기가 파일을 키 경로로 사용할 수 있기 때문에 ICE43 오류를 우회합니다 . DISABLEADVTSHORTCUTS가 설정 되었기 때문에 Windows Installer는 이러한 광고 된 바로 가기를 일반 바로 가기로 바꿉니다.

나는 설정 패키지 요소의 "perMachine"에 InstallScope 속성을. 그러면 ALLUSERS 속성이 1로 설정됩니다. 그러면 ProgramMenuFolderDesktopFolder 의 값이 모든 사용자 프로필로 확인됩니다.

ProgramMenuFolder 아래에 생성 된 폴더의 경우 RemoveFolder 및 RegistryValue 요소가 있습니다. 내가 본 예제 ( ex1 , ex2 )는 HKCU를 RegistryValue의 루트로 사용합니다. 이 루트를 ALLUSERS의 값에 따라 HKCU 또는 HKLM 으로 확인 하는 HKMU로 변경했습니다 .

간단히 말해, DISABLEADVTSHORTCUTS를 1로 설정하면 보급 된 바로 가기가 ICE 오류를 생성하지 않지만 설치시 보급되지 않은 바로 가기로 변환됩니다. 루트 HKMU가있는 RegistryValue는 광고되지 않은 바로 가기의 키 경로가 아닌 한 KeyPath에 적합합니다.

<?xml version="1.0" encoding="utf-8"?>
<!-- This example is based on SampleFirst by Gábor DEÁK JAHN, Tramontána:
        http://www.tramontana.co.hu/wix/lesson1.php#1.3
    Original SampleFirst:
        http://www.tramontana.co.hu/wix/download.php?file=samples/samplefirst.zip&type=application/zip -->
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Name="Foobar 1.0" Id="YOURGUID-21F1-4026-ABD2-7CC7F8CE4D18" UpgradeCode="YOURGUID-AFA4-46C6-94AA-EEE3D104F903" Language="1033" Codepage="1252" Version="1.0.0" Manufacturer="Acme Ltd.">
        <Package Id="*" Keywords="Installer" Description="Acme's Foobar 1.0 Installer" Comments="Foobar is a registered trademark of Acme Ltd." Manufacturer="Acme Ltd." InstallerVersion="100" Languages="1033" Compressed="yes" SummaryCodepage="1252" InstallScope="perMachine" />
        <Media Id="1" Cabinet="Sample.cab" EmbedCab="yes" DiskPrompt="CD-ROM #1" />
        <Property Id="DiskPrompt" Value="Acme's Foobar 1.0 Installation [1]" />
        <Property Id="DISABLEADVTSHORTCUTS" Value="1" />
        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder" Name="PFiles">
                <Directory Id="Acme" Name="Acme">
                    <Directory Id="INSTALLDIR" Name="Foobar 1.0">
                        <Component Id="MainExecutable" Guid="YOURGUID-3E4F-47A2-86F1-F3162E9C4798">
                            <File Id="FoobarEXE" Name="FoobarAppl10.exe" DiskId="1" Source="FoobarAppl10.exe" KeyPath="yes">
                                <Shortcut Id="startmenuFoobar10" Directory="ProgramMenuDir" Name="Foobar 1.0" WorkingDirectory="INSTALLDIR" Icon="Foobar10.exe" IconIndex="0" Advertise="yes" />
                                <Shortcut Id="desktopFoobar10" Directory="DesktopFolder" Name="Foobar 1.0" WorkingDirectory="INSTALLDIR" Icon="Foobar10.exe" IconIndex="0" Advertise="yes" />
                            </File>
                        </Component>
                        <Component Id="HelperLibrary" Guid="YOURGUID-C7DA-4C02-A2F0-A6E089FC0CF3">
                            <File Id="HelperDLL" Name="Helper.dll" DiskId="1" Source="Helper.dll" KeyPath="yes" />
                        </Component>
                        <Component Id="Manual" Guid="YOURGUID-FF92-4BF4-A322-819A3B2265A0">
                            <File Id="Manual" Name="Manual.pdf" DiskId="1" Source="Manual.pdf" KeyPath="yes">
                                <Shortcut Id="startmenuManual" Directory="ProgramMenuDir" Name="Instruction Manual" Advertise="yes" />
                            </File>
                        </Component>
                    </Directory>
                </Directory>
            </Directory>
            <Directory Id="ProgramMenuFolder" Name="Programs">
                <Directory Id="ProgramMenuDir" Name="Foobar 1.0">
                    <Component Id="ProgramMenuDir" Guid="YOURGUID-D1C2-4D76-BA46-C6FA79862E77">
                        <RemoveFolder Id="ProgramMenuDir" On="uninstall" />
                        <RegistryValue Root="HKMU" Key="Software\[Manufacturer]\[ProductName]" Type="string" Value="" KeyPath="yes" />
                    </Component>
                </Directory>
            </Directory>
            <Directory Id="DesktopFolder" Name="Desktop" />
        </Directory>
        <Feature Id="Complete" Level="1">
            <ComponentRef Id="MainExecutable" />
            <ComponentRef Id="HelperLibrary" />
            <ComponentRef Id="Manual" />
            <ComponentRef Id="ProgramMenuDir" />
        </Feature>
        <Icon Id="Foobar10.exe" SourceFile="FoobarAppl10.exe" />
    </Product>
</Wix>

귀하의 답변에 대한 세부 정보가 정말 훌륭합니다. WiX 문서와 샘플을 살펴보면서 이것이 매우 유용하다는 것을 알았습니다. 감사!
Dave

7
좋은 대답입니다. 그러나 별도의 구성 요소에 바탕 화면 바로 가기가 있다고 가정합니다 (조건부로 설치하기 때문에). IIUC 이러한 바로 가기는 광고 할 수 없습니다. DISABLEADVTSHORTCUTS를 사용해도 Advertise = "yes"를 추가하려고하면 CNDL0035 오류가 발생합니다. HKMU 레지스트리 키로 이러한 바로 가기를 만드는 방법을 볼 수 있습니까?
marcin 2011

9
좋은 해결책을 찾았다면 자신의 질문에 답하는 것은 나쁜 에티켓이 아니며, 그렇게 해주셔서 감사합니다. +1!
fzwo

아이콘을 실행 파일로 참조하지 마십시오. 아이콘은 특수 디렉토리 (Windows \ Installer \ {GUID})에 복사되며 바로 가기는이 위치의 아이콘 (예 : INSTALLDIR의 실행 파일이 아님)을 사용하므로 별도의 아이콘 파일을 사용하는 것이 좋습니다.
Dmitry Azaraev 2015

정말 고맙습니다. 이 문제를 해결하는 데 몇 시간을 보냈습니다. DISABLEADVTSHORTCUTS에 대한 단서가 없었습니다.
Jason Hughes

8

이 게시물은 다소 오래되었지만 매우 유용한 정보를 포함하고 있으며 여전히 활성화되어 있습니다. 일반적으로 바로 가기에 더미 레지스트리 키가 필요하지 않다는 점을 지적하고 싶습니다! AFAIK 이것은 WiX 자습서이며 MSI 또는 인증 요구 사항이 아닙니다. 다음은 reg 키가없는 예입니다.

<Fragment Id="Folders">
  <Directory Id="TARGETDIR" Name="SourceDir">
    <Directory Id="ProgramFilesFolder">
      <Directory Id="INSTALLFOLDER" Name="MyApp">
      </Directory>
    </Directory>
    <Directory Id="ProgramMenuFolder">
      <Directory Id="MyAppStartMenuDir" Name="MyApp"/>
    </Directory>
  </Directory>
</Fragment>
<Fragment Id="Components">
  <Component Id="MyAppComp" Directory="INSTALLFOLDER" ...>
    <!--The advertise flag below is to bypass ICE errors in WiX, the actual shortcut will not be advertises if those are disabled globally with DISABLEADVTSHORTCUTS-->
    <File ..." KeyPath="yes">
      <Shortcut Id="MyAppStartMenuLink" Directory="MyAppStartMenuDir" Advertise="yes" ... />
    </File>
    <RemoveFolder Id="StartMenuDirRemoved" Directory="MyAppStartMenuDir" On="uninstall" />
  </Component>
</Fragment>

이렇게하면 바로 가기와 실행 파일이 하나의 구성 요소에 포함됩니다. 이것이 신경 쓰이는 경우 더미 레지스트리 키를 사용하십시오 (잘 설명 된 자체 답변에서와 같이).


1
Product 요소에 <Property Id = "DISABLEADVTSHORTCUTS"Value = "1"/>을 추가하는 것을 잊지 마십시오
sartoris

@sartoris 이것은 답변에 추가되어야합니다. 그것 없이는 작동하지 않습니다.
Alex Zhukovskiy

2

From MSI to WiX, Part 10-Shortcuts by Alex Shevchuk 살펴보세요 .

또는 Rob Menching의 블로그 게시물 How to create an uninstall shortcut (and pass all ICE validation).

기본적으로 ICE57은 다소 짜증이납니다 ...하지만 여기에 데스크탑 바로 가기에 사용하는 코드가 있습니다.

<Component Id="DesktopShortcut" Directory="APPLICATIONFOLDER" Guid="*">
    <RegistryValue Id="RegShortcutDesktop" Root="HKCU" Key="SOFTWARE\My App\1.0\settings" Name="DesktopSC" Value="1" Type="integer" KeyPath="yes" />
    <Shortcut Id="desktopSc" Target="[APPLICATIONFOLDER]MyApp.exe" Directory="DesktopFolder" Name="My Applications" Icon="myapp.ico" IconIndex="0" WorkingDirectory="APPLICATIONFOLDER" Advertise="no"/>
    <RemoveFolder Id="RemoveShortcutFolder" On="uninstall" />
    <Condition>DT_SHORTCUT=1</Condition>
</Component>

9
이 예에서는 "HKCU"를 키 경로로 사용합니다. 한 사용자가 앱을 설치하고 다른 사용자가 앱을 제거하면 레지스트리 키가 남아 있습니다. 게시 된 첫 번째 링크는 레지스트리 키로 HKCU를 사용합니다. 두 번째는 ICE43 및 ICE57 오류를 생성하는 키 경로로 파일을 사용합니다.
mcdon

1
네, 레지스트리 키입니다. 그러나 지름길 자체가 아닙니다 :)
saschabeaumont
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.