Wix सभी उपयोगकर्ताओं / प्रति मशीन के लिए गैर-विज्ञापित शॉर्टकट बनाता है


81

विज़िटर में, आप ऑलर्स प्रोफाइल में एक गैर-विज्ञापित शॉर्टकट कैसे बनाते हैं? अब तक मैं केवल विज्ञापित शॉर्टकट के साथ इसे पूरा करने में सक्षम रहा हूं। मैं गैर-विज्ञापित शॉर्टकट पसंद करता हूं क्योंकि आप शॉर्टकट के गुणों पर जा सकते हैं और "लक्ष्य खोजें" का उपयोग कर सकते हैं।

ट्यूटोरियल में मैंने एक शॉर्टकट के कीपैथ के लिए एक रजिस्ट्री मान का उपयोग किया है। समस्या यह है कि वे जड़ के रूप में एचकेसीयू का उपयोग करते हैं। जब HKCU का उपयोग किया जाता है, और एक अन्य उपयोगकर्ता प्रोग्राम को पुनर्स्थापित करता है (क्योंकि यह सभी उपयोगकर्ताओं के लिए स्थापित है) रजिस्ट्री कुंजी पीछे छोड़ दी गई है। जब मैं HKMU को रूट के रूप में उपयोग करता हूं तो मुझे ICE57 त्रुटि मिलती है, लेकिन कुंजी तब हटा दी जाती है जब कोई अन्य उपयोगकर्ता प्रोग्राम को अनइंस्टॉल करता है। मुझे एचकेसीयू का उपयोग करने के लिए धक्का दिया जा रहा है, हालांकि एचकेएमयू सही ढंग से व्यवहार करने लगता है (प्रति-उपयोगकर्ता बनाम उपयोगकर्ता)।

जब मैं गैर-विज्ञापित शॉर्टकट बनाने की कोशिश करता हूं तो मुझे विभिन्न ICE त्रुटि मिलती है जैसे ICE38, ICE43, या ICE 57। अधिकांश लेख मैंने देखा है कि "बस बर्फ की त्रुटियों को अनदेखा करें"। बिना ICE त्रुटियां बनाए, गैर-विज्ञापित शॉर्टकट बनाने का एक तरीका होना चाहिए।

कृपया एक कार्य उदाहरण के लिए नमूना कोड पोस्ट करें।

जवाबों:


113

क्षमा करें यदि यह मेरे स्वयं के प्रश्न का उत्तर देने के लिए बुरा शिष्टाचार है।

हाल ही में मैंने DISABLEADVTSHORTCUTS संपत्ति की जानकारी पर ठोकर खाई । मैंने विज्ञापित शॉर्टकट के साथ एक इंस्टाल बनाया और 1 के लिए DISABLEADVTSHORTCUTS प्रॉपर्टी सेट की, जिसने नॉन-एडवर्टाइजिंग शॉर्टकट तैयार किए। यह ICE43 त्रुटियों को दरकिनार कर देता है क्योंकि एक विज्ञापित शॉर्टकट एक फ़ाइल को कीपैथ के रूप में उपयोग कर सकता है। क्योंकि DISABLEADVTSHORTCUTS को Windows इंस्टालर सेट किया गया है, जो इन विज्ञापित शॉर्टकट को नियमित शॉर्टकट से बदल देगा।

मैंने पैकेज तत्व की InstallScope विशेषता को "perMachine" पर सेट किया है। यह ALLUSERS गुण को 1 पर सेट करता है। ProgramMenuFolder और DesktopFolder के मान तब सभी उपयोगकर्ता प्रोफ़ाइल पर हल होंगे।

ProgramMenuFolder के अंतर्गत बनाए गए फ़ोल्डर के लिए एक RemoveFolder और रजिस्ट्रीवाल्यू तत्व है। उदाहरण मैंने देखा है ( EX1 , ex2 ) उपयोग RegistryValue के लिए रूट के रूप में HKCU। मैंने इस रूट को HKMU में बदल दिया, जो ALLUSERS के मूल्य के आधार पर HKCU या HKLM को हल करता है।

संक्षेप में, DISABLEADVTSHORTCUTS के साथ 1 आपके विज्ञापित शॉर्टकट ICE त्रुटियों का उत्पादन नहीं करेगा, लेकिन स्थापित होने पर गैर-विज्ञापित शॉर्टकट में परिवर्तित हो जाएगा। मूल HKMU के साथ एक रजिस्ट्रीव्यू तब तक KeyPath के लिए ठीक है, जब तक कि यह गैर-विज्ञापित शॉर्टकट के लिए 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>

आपके उत्तर में विवरण के साथ वास्तव में अच्छा काम। मुझे यह बेहद मददगार लगा, क्योंकि मैं वाईएक्स डॉक्यूमेंटेशन और सैंपल के जरिए काम कर रहा हूं। धन्यवाद!
डेव

7
बहुत बढ़िया जवाब। लेकिन मान लीजिए कि मेरे पास एक अलग घटक में एक डेस्कटॉप शॉर्टकट है (क्योंकि मैं इसे सशर्त रूप से स्थापित करता हूं)। IIUC ऐसे शॉर्टकट का विज्ञापन नहीं किया जा सकता है। अगर मैं DISABLEADVTSHORTCUTS के साथ भी विज्ञापन = "हां" जोड़ने की कोशिश करता हूं तो मुझे त्रुटि CNDL0035 मिलती है। क्या आप HKMU रजिस्ट्री कुंजी के साथ इस तरह के शॉर्टकट बनाने का तरीका देख सकते हैं?
मार्सिन

9
अपने स्वयं के प्रश्न का उत्तर देना बिल्कुल भी बुरा शिष्टाचार नहीं है यदि आपने एक अच्छा समाधान पाया है, और मैं बहुत आभारी हूं कि आपने किया - और बूट के लिए एक उत्कृष्ट उत्तर के साथ। +1!
fzwo

निष्पादन योग्य फ़ाइल के लिए संदर्भ आइकन न करें। आइकन को विशेष निर्देशिका (Windows \ Installer \ {GUID}) में कॉपी किया जाता है, और शॉर्टकट इस स्थान से आइकन का उपयोग करेगा (अर्थात INSTALLDIR में निष्पादन योग्य से नहीं), इसलिए अलग आइकन फ़ाइल का उपयोग करना बेहतर है।
दिमित्री अजारव

बहुत बहुत धन्यवाद। मैंने इस समस्या निवारण में घंटों बिताए। DISABLEADVTSHORTCUTS के बारे में कोई सुराग नहीं था।
जेसन ह्यूजेस

8

हालाँकि यह पोस्ट पुरानी है, लेकिन इसमें काफी उपयोगी जानकारी है और यह अभी भी सक्रिय दिखता है। मैं यह बताना चाहता हूं कि सामान्य तौर पर आपको अपने शॉर्टकट के लिए डमी रजिस्ट्री कुंजी की आवश्यकता नहीं है! AFAIK यह वाईएक्स ट्यूटोरियल चीज़ है और एमएसआई या प्रमाणन की आवश्यकता नहीं है। यहाँ एक उदाहरण है जिसमें कोई 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
उत्पाद तत्व में <गुण Id = "DISABLEADVTSHORTCUTS" मान = "1" /> जोड़ना याद रखें
sartoris

@ सार्टोरिस को उत्तर में जोड़ा जाना चाहिए। इसके बिना यह काम नहीं करता है।
एलेक्स झूकोवस्की

2

एलेक्स शेवचुक द्वारा एमएसआई से वाईएक्स, भाग 10 - शॉर्टकट पर एक नज़र डालें ।

या रोब मेनचिंग का ब्लॉग पोस्ट अनइंस्टॉल शॉर्टकट कैसे बनाएं (और सभी आईसीई सत्यापन पास करें)।

मूल रूप से 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
रजिस्ट्री कुंजी, हाँ। शार्टकट नहीं
बल्कि
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.