c++ Wix Msi इंस्टॉलर का उपयोग करके स्थापना के बाद COM में CPP dll पंजीकृत करना




windows-installer wix3.10 (3)

मैं Msi स्थापना के दौरान COM में CPP लाइब्रेरी पंजीकृत करने का प्रयास कर रहा हूं।

मैंने बहुत खोज की है और यहां कई समाधान पाए हैं, लेकिन मेरे कोड में कुछ भी काम नहीं कर रहा है। मुझे नहीं पता कि इसके लिए कोई सीधा तरीका है। मैंने प्रत्यक्ष ExeCommand के साथ और एक बैच स्क्रिप्ट के साथ कस्टम एक्शन का उपयोग करने की कोशिश की है।

यहाँ बैच स्क्रिप्ट के साथ कोड है।

<SetProperty Id="Register" Value="&quot;[INSTALLDIR]Scripts\Register.bat&quot;" After="CostFinalize"/>
<CustomAction Id="Register" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="deferred" Return="check" Impersonate="no"/> 

<SetProperty Id="Unregister" Value="&quot;[INSTALLDIR]Scripts\UnRegister.bat&quot;" After="CostFinalize"/>
<CustomAction Id="Unregister" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="deferred" Return="check" Impersonate="no"/>

इस कोड का उपयोग करके, इंस्टॉलेशन में कोई त्रुटि नहीं दिखाई देती है, लेकिन dll पंजीकृत नहीं हो रहा है। स्थापना के बाद यदि मैंने बैच स्क्रिप्ट अलग से चलाई तो वह पंजीकृत हो जाती है।

Register.bat

cd "C: \ Windows \ System32"

regsvr32 "C: \ Program Files (x86) \ ABC \ Abc.dll"

पिंग-एन 15 127.0.0.1> nul:

Unregister.bat

cd "C: \ Windows \ System32"

regsvr32 / u "C: \ Program Files (x86) \ ABC \ Abc.dll"

पिंग-एन 15 127.0.0.1> nul:

ExeCommand के साथ कस्टम कार्रवाई के साथ यह कुछ dll निर्भरता लापता की तरह त्रुटि दिखाता है। ExeCommand कोड नीचे दिया गया है।

<CustomAction Id="Register" Directory="INSTALLDIR" Execute="deferred" Impersonate="no"
              ExeCommand="[WindowsFolder]System32\regsvr32 &quot;[INSTALLDIR]Abc.dll&quot;" Return="check" />
<CustomAction Id="Unregister" Directory="INSTALLDIR" Execute="deferred" Impersonate="no"
             ExeCommand="[WindowsFolder]System32\regsvr32 /u &quot;[INSTALLDIR]Abc.dll&quot;" Return="check" />

और InstallSequencefor दोनों मामले नीचे दिए गए हैं।

 <InstallExecuteSequence> 
    <Custom Action="Register" Before="InstallFinalize" >NOT Installed</Custom>
    <Custom Action="Unregister" Before="RemoveFiles">Installed AND NOT UPGRADINGPRODUCTCODE</Custom>
 </InstallExecuteSequence>

दोनों ही मामलों में मुझे लगता है कि यह उन्नत विशेषाधिकार के साथ चल रहा है।

यह वह त्रुटि है जो मुझे ज्यादातर समय मिलती है।

संपादित करें

Dll की निर्भरता वॉकर दृश्य नीचे दिखाया गया है।

इसके अलावा मैं इस्तेमाल की गई हीट कमांड जोड़ रहा हूं। मैंने इसे घटक को बनाने के लिए घटना को बनाने के लिए जोड़ा है। उसके बाद इस घटक को उत्पाद फ़ाइल में जोड़ा गया।

कॉल "$ (आगंतुक) बिन \ heat.exe" फ़ाइल "dllPath \ Abc.dll" -dr "INSTALLDIR" -srd -sfrag -suid -out "$ (SolutionDir) इंस्टॉलर के ComRegisterComponent.wxs"

और उत्पन्न फ़ाइल इस तरह दिखती है।

 <Fragment>
    <DirectoryRef Id="INSTALLDIR">
        <Component Id="Abc.dll" Guid="*">
            <File Id="Abc.dll" KeyPath="yes" Source="SourceDir\Abc.dll" />
        </Component>
    </DirectoryRef>
</Fragment>

यहाँ यह SourceDir पथ मुझे भ्रमित कर रहा है। मैंने हीट कमांड में सटीक पथ जोड़ा है तब भी यह इस SourceDir को उत्पन्न करता है।


बस regsvr32.exe का उपयोग करके स्व-पंजीकरण के दौरान गुम निर्भरता को डीबग करने के लिए कुशल तरीके से procmon.exe का उपयोग करने के तरीके के बारे में जानकारी के साथ एक और उत्तर जोड़ रहा है।

अनिवार्य रूप से आपको एक फ़िल्टर शामिल करना चाहिए कि आप किन घटनाओं की निगरानी करना चाहते हैं और रिकॉर्ड करना चाहते हैं, अन्यथा आपको सूचीबद्ध अप्रासंगिक घटनाओं की एक सर्वशक्तिमान सूची मिलती है और यह मुश्किल है कि आपको बेकार जानकारी के समुद्र में क्या चाहिए:

  1. कैप्चर की गई प्रक्रिया की जानकारी को सीमित करने के लिए आपको क्या चाहिए, बस Filter => Filter...
  2. Process Name लिए बाईं ओर नीचे सेट करें और फिर दूसरा कॉलम is और अंत में चित्र में ऊपर बताए अनुसार सही बॉक्स में regsvr32.exe टाइप regsvr32.exe
  3. महत्वपूर्ण रूप से Include करने के लिए सबसे सही बॉक्स सेट Include । फिर ओके दबाएं।
  4. सभी अनावश्यक घटनाओं को अब दबा दिया जाना चाहिए और केवल regsvr32.exe घटनाओं को प्रदर्शित किया जाता है (जब आपको इसे चलाने के लिए मिलता है)।
  5. सामान्य तरीके से regsvr32.exe चलाएं और सूची में " NAME NOT FOUND " प्रविष्टियां (या समान) देखें।
  6. MMUtilities.dll नीचे चित्रण में नहीं पाया जा सकता है। दूसरे शब्दों में यह एक लापता निर्भरता है।

और कृपया ध्यान दें कि आप नीचे और नीचे चित्रित बटनों पर क्लिक करके एक निश्चित प्रकार की घटनाओं को शामिल / बाहर कर सकते हैं। Registry events , file system events , network activity , process and tread activity , profiling events । इससे सूची में आपको "शोर" को कम करना पड़ सकता है।

स्व-पंजीकरण के दौरान लापता निर्भरता को डीबग करने का दूसरा तरीका यह है कि डिपेंडेंसी वॉकर का उपयोग इस "थ्रेड" या प्रश्न में मेरे अन्य उत्तर में सचित्र किया जाए या जो भी इसे कॉल किया जाए। आम तौर पर मुझे डिपेंडेंसी वाकर तेज विकल्प लगता है, लेकिन procmon.exe शायद समग्र रूप से बेहतर है - जब तक आप एक EXE फ़ाइल डिबगिंग नहीं कर रहे हैं, तब तक डिपेंडेंसी वॉकर में बेहतर Profile सुविधा ( Profile => Start Profiling... ) है।


संक्षिप्त, सारांश उत्तर

आपको COM पंजीकरण (अविश्वसनीय) के लिए बैच फ़ाइलों और कस्टम क्रियाओं का उपयोग बंद करने की आवश्यकता है, और संकलन समय पर अपने MSI डेटाबेस में COM पंजीकरण को जोड़ने के लिए WiX टूलकिट से heat.exe उपकरण का उपयोग करके COM पंजीकरण जानकारी निकालें।

64-बिट बायनेरिज़ के लिए कुछ जटिलताएँ हैं, नीचे विवरण देखें। सौभाग्य से ऐसा लगता है कि आप ऊपर दिखाए गए अपने इंस्टॉलेशन डायरेक्टरी के आधार पर 32-बिट घटक के साथ काम कर रहे हैं।

इस विशेष स्थिति में यह COM फ़ाइल पर गर्मी। Exe को चलाने में मदद करता है परिनियोजन के बाद जब COM फ़ाइल ठीक से लोड करने के लिए सभी निर्भरता "जगह" में थी। इन उत्तरों में बहुत सारे "डीबगिंग संचार" है - मैं इसे भविष्य के लिए सभी जगह छोड़ दूंगा, लेकिन पहले इस सरल समाधान का प्रयास करें। और शायद नीचे वर्णित नए निर्भरता उपकरण "निर्भरता। Exe" का प्रयास करें।

लंबा, विस्तृत जवाब

इससे पहले कि मैं इस प्रश्न का उत्तर देने की कोशिश करूँ (जो कि आपकी निर्भरता को गायब करता है या आपकी बैच फ़ाइल में कुछ अजीब हो रहा है ), मैं आपको COM पंजीकरण के लिए सर्वोत्तम अभ्यास के संबंध में कुछ बातें स्पष्ट करना चाहता हूं।

नोट : स्क्रीनशॉट आपकी बैच फ़ाइल में कुछ अजीब चल रहा है, पर संकेत देता है, लेकिन लापता निर्भरता अभी भी एक मुद्दा हो सकती है।

स्व-पंजीकरण हानिकारक माना जाता है

COM फ़ाइलों को पंजीकृत करने के लिए स्व-पंजीकरण का उपयोग नहीं किया जाना चाहिए । यहाँ इस बात का विवरण दिया गया है कि ऐसा क्यों है: MSI रजिस्टर dll - स्व-पंजीकरण हानिकारक माना जाता है । हालांकि, अच्छी खबर यह है कि बिल्ट-इन MSI मैकेनिज्म के माध्यम से चीजों को करना एक बार ठीक से सेट हो जाने के बाद दोनों आसान और अधिक विश्वसनीय होगा।

कस्टम क्रियाओं का उपयोग किए बिना इंस्टॉलेशन के दौरान फ़ाइलों को सेल्फ-रजिस्टर करने का एक तरीका है जैसे आप ( सेल्फरेग टेबल ) करने की कोशिश कर रहे हैं। सही तरीके से काम करने के लिए कस्टम क्रियाएं बहुत कठिन हैं, लेकिन आपको स्व-पंजीकरण चलाने के लिए अंतर्निहित तंत्र का उपयोग नहीं करना चाहिए (जैसा कि ऊपर दिए गए लिंक में विस्तार से बताया गया है)

कस्टम क्रिया या SelfReg तालिका का उपयोग करने के बजाय, COM पंजीकरण जानकारी को आपकी COM फ़ाइलों से संकलन समय पर निकाला जाना चाहिए - दूसरे शब्दों में जब आप अपनी MSI फ़ाइल को अपने WiX स्रोत फ़ाइलों से संकलित करते हैं। निकाले गए रजिस्ट्री डेटा का उपयोग MSI डेटा टेबलों के परिवार को मज़बूती से रजिस्टर करने के लिए किया जाना चाहिए, जो क्रमशः COM फ़ाइल को स्थापना और स्थापना के दौरान अपंजीकृत करते हैं।

वाईएक्स: "हीट.exe" कमांड लाइन टूल

इस प्रक्रिया के जटिल विवरणों को समझना आवश्यक नहीं है - आपको यह जानने की आवश्यकता है कि कौन से उपकरण का उपयोग करना है। वाईएक्स इस उद्देश्य के लिए " हीट.exe " टूल प्रदान करता है। यह अनिवार्य रूप से एक " हारवेस्टर " उपकरण है जो कई उद्देश्यों के लिए वैध वाईएक्स एक्सएमएल स्रोत फ़ाइलों को बनाने में सक्षम है - जिनमें से एक COM निष्कर्षण है। यह सामान्य रूप से उत्पन्न करने वाली निर्देशिकाओं का भी समर्थन करता है - वाईएक्स स्रोत फ़ाइलों को उत्पन्न करना जो ट्रैवर्सल के दौरान सामने आई फाइलों को स्थापित कर सकते हैं। यह अनिवार्य रूप से एक एमएसआई पैकेज बनाने का एक बहुत ही त्वरित तरीका है जब आप जानते हैं कि इसका उपयोग कैसे करना है।

निर्भरता वाकर

इसलिए हमने यह स्थापित किया है कि आपको COM फ़ाइल को ठीक से पंजीकृत करने के लिए आवश्यक वाईएक्सएक्स स्रोत उत्पन्न करने के लिए हीट.नेट का उपयोग करने का तरीका जानने के लिए समय निकालना चाहिए। हालाँकि, एक और समस्या है : लापता निर्भरताएँ

COM फ़ाइल को स्व-रजिस्टर करने में सक्षम होने के लिए - या आपके लिए सफलतापूर्वक गर्मी रजिस्ट्री का उपयोग करके COM रजिस्ट्री डेटा निकालने में सक्षम होने के लिए - COM फ़ाइल को सही ढंग से लोड करने में सक्षम होना चाहिए। यह संभव हो सके इसके लिए सभी डीएल निर्भरताएँ सुलभ स्थान पर प्रणाली में उपलब्ध होनी चाहिए।

अपने आप पर निर्भरता वॉकर की एक प्रति प्राप्त करें और इसका उपयोग अपनी COM फाइल को स्कैन करने के लिए करें कि यह किन फाइलों पर निर्भर करता है। यहाँ एक COM फ़ाइल का एक उदाहरण है जो लोड करने में विफल रहता है क्योंकि यह MMUtilities.dll नहीं पा MMUtilities.dll :

जब आपके सेटअप के इंस्टॉलेशन स्थान से इसे चलाया जाता है, तो आपको अपने dll (या उदाहरण के लिए जो भी फ़ाइल प्रकार, उदाहरण के लिए OCX है) के साथ कुछ ऐसा ही गलत होगा। आवश्यक निर्भरता फ़ाइलों को regsvr32.exe द्वारा नहीं पाया जा सकता है और पंजीकरण प्रक्रिया विफल हो जाती है।

कुछ रिपोर्टेड गुम निर्भरताएं हैं जो महत्वपूर्ण नहीं हैं - मुझे लगता है कि यह निर्भरता वॉकर उपकरण की उम्र के साथ करना है - यह हाल ही में अपडेट नहीं किया गया है जहां तक ​​मुझे पता है। एक फ़ाइल जिसे आप या तो अपनी निर्भरता फ़ाइल के रूप में पहचानते हैं या एक कोर सिस्टम फ़ाइल के रूप में पहचानते हैं जो आपने कभी नहीं सुनी फाइलों के बहुत लंबे dll नामों के विपरीत है। ध्यान रखें कि कुछ dll में निर्भरता भाषा dll होती है जो लोडिंग के लिए आवश्यक होती है। उदाहरण के लिए MMUtilities.dll को सही ढंग से लोड करने में सक्षम होने के लिए एक ही फ़ोल्डर में मौजूद MmUtilitiesEnglish.dll या किसी अन्य भाषा dll की आवश्यकता होगी।

उपरोक्त फ़ाइल के लिए कुछ नमूना गलत सकारात्मक निर्भरता : API-MS-WIN-CORE-RTLSUPPORT-L1-1-0.DLL , API-MS-WIN-CORE-PROCESSTHREADS-L1-1-0.DLL , API-MS-WIN-CORE-REGISTRY-L1-1-0.DLL , आदि ... कई थे। मुझे विश्वास है, लेकिन मुझे यकीन नहीं है, कि WinSxS फ़ोल्डर में स्थापित साइड-बाय-साइड घटकों के साथ समस्याओं के आसपास इन झूठे सकारात्मक केंद्रों का मूल कारण है, लेकिन यह एक पूरी अन्य चर्चा है - बस इसका उल्लेख कर रहा है।

अद्यतन : मैंने अभी इसे फिर से जांचा और ऊपर दिखाई देने वाली अधिकांश झूठी सकारात्मक निर्भरताएं जाहिरा तौर पर API-sets - निर्भरता वॉकर बनाए जाने के लंबे समय बाद पेश की गई एक विंडोज सुविधा, और इसलिए उपकरण द्वारा सही तरीके से संभाला नहीं गया।

जैसा कि जुड़ा हुआ उत्तर इंगित करता है (इसे पढ़ें, ऊपर लिंक करें), अब C # " निर्भरता " नामक C में डिपेंडेंसी वॉकर का पुनर्लेखन भी उपलब्ध है, यहाँ उपलब्ध है: https://github.com/lucasg/Dependencies dependencies (उस समय मेरे द्वारा अनुपलब्ध) लेखन की, शीघ्र ही परीक्षण करेगा)।

इसके अलावा त्वरित उल्लेख: यदि आपके पास जांच करने के लिए एक निष्पादन योग्य है (एक डीएल, ओएक्सएक्स, आदि ... के विपरीत), तो आप इसे Profile => Start Profiling... मेनू प्रविष्टि के माध्यम से लॉन्च कर सकते हैं और फिर आप " छिपा " देखेंगे। रन-टाइम निर्भरताएं "बाइनरी आयात तालिका (जहां निर्भरता / आयात निर्दिष्ट हैं) में निर्दिष्ट नहीं हैं। आपको सभी संवादों में सभी विशेषताओं का उपयोग करके वास्तव में आवेदन करने की आवश्यकता है ताकि इस तरह की सभी निर्भरताएं सुनिश्चित हो सकें।

निर्भरता वॉकर वेब पेज इन छिपी हुई निर्भरताओं को स्पष्ट निर्भरता (एक गतिशील या रन-टाइम निर्भरता) और सिस्टम हुक निर्भरता (इंजेक्टेड निर्भरता) कहता है। अधिक विवरण के लिए ऊपर दिए गए लिंक को देखें।

Heat.exe निष्कर्षण

एक बार जब आप यह निर्धारित कर लेते हैं कि आपके वाईएक्स हीट। एक्सट्रेक्शन कार्य करने के लिए कौन सी फाइलें गायब हैं, तो आप फाइलों को "आपके COM डीएल" के बगल में रख सकते हैं ताकि वे इसके लोडिंग के दौरान मिलें। यदि आप पंजीकरण सही ढंग से पूरा करते हैं, तो आप regsvr32.exe का उपयोग करके परीक्षण कर सकते हैं। जब आप मैन्युअल रूप से इस तरह पंजीकरण चलाते हैं तो कोई त्रुटि संदेश नहीं होना चाहिए। एक उन्नत कमांड प्रॉम्प्ट से पंजीकरण चलाने के लिए याद रखें

कई अन्य स्टैकओवरफ़्लो उत्तर बताते हैं कि हीट एक्स का उपयोग कैसे करें - मैंने इसे लंबे समय में उपयोग नहीं किया है: हीट रन कैसे करें और विक्स में एक डीएलएल रजिस्टर करें । यहाँ WiX लोगों से heat.exe के लिए आधिकारिक दस्तावेज दिया गया है। यह कुछ हद तक डराने वाला उपकरण हो सकता है - इसमें बहुत सारी विशेषताएं हैं।

अपने सरलतम रूप में (पथ या स्थानीय फ़ोल्डर में उपलब्ध सभी निर्भरता वाली सामान्य 32-बिट COM फ़ाइलों के लिए), आप सभी आवश्यक COM रजिस्ट्री के साथ YourFileName.wxs नामक आउटपुट वाईएक्स स्रोत फ़ाइल उत्पन्न करने के लिए इस हीट.नेट कमांड लाइन को चला सकते हैं। डेटा।

heat.exe file YourFileName.ocx -o YourFileName.wxs

मैंने कई साल पहले एक जवाब लिखा था कि निर्यात किए गए वाईएक्स रजिस्ट्री डेटा को अपने मुख्य वाईएक्स स्रोत में कैसे शामिल किया जाए : विक्स (कमांड लाइन) में एक हीट आउटपुट (डब्ल्यूएक्स) को कैसे संदर्भित किया जाए । मेरा मानना ​​है कि यह प्रक्रिया का एक सटीक विवरण है, लेकिन किसी कारण से किसी ने जवाब को डाउन-वोट किया। कृपया इसे दें और देखें कि क्या यह आपके लिए काम करता है।

जरूरी! : heat.exe अभी तक 64-बिट COM बायनेरिज़ (दिसंबर, 2017) को सही ढंग से संसाधित नहीं करता है।

मुझे बताया गया है कि वाईएक्स एक्सपैंशन पैक ( फ्री नहीं ) 64-बिट बायनेरी को संभालता है और कई अन्य सुविधाएँ प्रदान करता है। मुझे लगता है कि मैं इससे लिंक कर सकता हूं (मैं फायरगायंट से संबद्ध नहीं हूं): https://www.firegiant.com/wix/wep-documentation/harvesting/ । किसी तरह लोगों को इन चीजों के बारे में जानने की जरूरत है, लेकिन मुझे जोड़ने के स्टैकओवरफ्लो शिष्टाचार के बारे में निश्चित नहीं है।

क्या आपके बायनेरी 64-बिट हैं? (यह आपके इंस्टॉलेशन फ़ोल्डर से ऐसा नहीं दिखता है, लेकिन मैं इसे उन अन्य लोगों के लिए जोड़ता हूं जो इसे ढूंढ सकते हैं)। 64-बिट घटक के लिए मुझे लगता है कि हम पूर्ण चक्र में आ गए हैं और आपको सलाह दी गई है कि आप या तो उपरोक्त विस्तार पैक सुविधा का उपयोग करें या यहाँ वर्णित के रूप में फ़ाइल को स्व-रजिस्टर में सेट करने का प्रयास करें । मैं इस स्व-रजिस्टर "समाधान" से नफरत करता हूं, लेकिन मैं इस समय किसी भी अन्य त्वरित सुधारों के बारे में नहीं सोच सकता (कोई भी चीज जो मैं वैसे भी सुझाऊंगा)। मैं फिर से जाँच करूँगा। यह देखने के लिए नवीनतम वाईएक्स रिलीज़ की जांच करना सुनिश्चित करें कि क्या इस "सेल्फ-रजिस्ट्रेशन फिक्स" के लिए जाने से पहले 64-बिट समस्या ठीक हो गई है । यह कस्टम क्रियाओं और बैच फ़ाइलों का उपयोग करके पंजीकरण करने की कोशिश करने से कम से कम बेहतर है (जिसे कभी भी प्रयास नहीं किया जाना चाहिए - एमएसआई के जटिल कस्टम एक्शन अनुक्रमण, प्रतिरूपण / उत्थान, कंडीशनिंग, मूक और संवादात्मक के साथ इंस्टॉलेशन मोड से संबंधित कई संभावित समस्याएं हैं, नहीं सुरक्षा सॉफ्टवेयर से संभावित हस्तक्षेप का उल्लेख करने के लिए, और सूची जारी होती है)।

कुछ लिंक:


डीएल को पंजीकृत करने के लिए एक बैट फ़ाइल का उपयोग करने के लिए विचार नहीं है। विंडोज इंस्टॉलर / वाईएक्स को आपके लिए करने दें। इसका उत्तर पूर्व में भी यहां दिया जा चुका है





wix3.10