2010-10-19 15 views
10

मैं पंजीकरण मुक्त COM सेट अप करने का प्रयास कर रहा हूं, लेकिन इसमें थोड़ी सी समस्या है कि मैं एक और COM ऑब्जेक्ट क्लाइंट हो सकता हूं।पंजीकरण नि: शुल्क कॉम और डीएल प्रकट होता है

App.exe -----> COM सर्वर/ग्राहक dll (पंजीकृत हो या नहीं) --------> COM सर्वर DLL (नहीं पंजीकृत)

मेरे सवालों का है, यह संभव है दूसरे डीएलएल (COM सर्वर/क्लाइंट डीएल) के लिए एक मैनिफेस्ट बनाने के लिए? मेरे पास निष्पादन योग्य का नियंत्रण नहीं है, लेकिन अगर मैंने किया, तो यह काम करता है अगर मैं निष्पादन योग्य के लिए क्लाइंट मैनिफेस्ट बनाता हूं और COM सर्वर dll के लिए सर्वर प्रकट होता है।

यह मध्य डीएल के लिए मैनिफेस्ट फ़ाइल है। मैंने इसे एम्बेड करने की कोशिश की और इसे बाहरी कोशिश की। अभी भी काम नहीं करता है।

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <assemblyIdentity type="win32" 
        name="COMCliSer.dll" 
        version="1.0.0.0" 
    /> 
    <dependency> 
    <dependentAssembly> 
     <assemblyIdentity 
        name="COMSer.dll" 
        version="1.0.0.0"      
     /> 
    </dependentAssembly> 
    </dependency> 
</assembly> 

आगे की जांच पड़ताल पर, मैं यह सब जब तक काम करने के लिए के रूप में मध्य dll भी पंजीकरण नि: शुल्क है और exe एक आवेदन प्रकट किया है प्राप्त कर सकते हैं। जैसे ही मैं मध्य डीएलएल पंजीकृत करता हूं, और एप्लिकेशन मैनिफेस्ट ड्रॉप करता हूं (मेरे पास नियंत्रण नहीं है कि एक्सई मेरे डीएल का उपयोग करेगा), पूरी चीज काम करना बंद कर देती है।

यदि exe के पास कोई प्रकट नहीं है, तो डीएलएल के मेनिफेस्ट को ध्यान में नहीं रखा जाता है। मैं काम करने के लिए सबकुछ स्थापित करके इसे साबित कर सकता हूं। फिर असेंबली मेनिफेस्ट में गलती डालें। यह सामान्य संदेश पॉप अप करता है:

प्रक्रिया बनाने में असमर्थ: यह एप्लिकेशन प्रारंभ करने में विफल रहा है क्योंकि एप्लिकेशन कॉन्फ़िगरेशन गलत है। अनुप्रयोग पुनर्स्थापित कर इस समस्या का हल किया जा सकता है।

मैं तो आवेदन प्रकट हो जाते हैं, आवेदन भार (CoCreateInstance यद्यपि विफल रहता है क्योंकि निर्भरता को ध्यान में रखा नहीं कर रहे हैं)

+0

क्यों आप 'comser.dll' विधानसभा बुला रहे हैं? क्या विधानसभा प्रकट जानकारी विलय हो गई है? एक वर्णनात्मक नाम के साथ असेंबली को तैनात करना बहुत आसान है उदा। "माइक्रोसॉफ्ट.VC90.CRT", जिसमें डीएल के विभिन्न नाम हैं: "msvcr90.dll"। डीएल-असेंबली से निपटने के दौरान डीबग करना मुश्किल हो जाता है क्योंकि एक मैनिफेस्ट अब दो उद्देश्यों को पूरा करता है: उपभोक्ताओं को असेंबली की सामग्री का वर्णन करने के लिए, और असेंबली में डीएल की निर्भरताओं का वर्णन करने के लिए। –

+0

निर्दोषों की रक्षा के लिए नाम बदल दिए गए हैं! वे असली नाम नहीं हैं। ये देशी COM dlls हैं और .NET असेंबली नहीं हैं। – Steve

+0

इसके अलावा, "काम नहीं करता" के रूप में क्या गिनती है? क्या exe और 2 डीएल लोड होता है और बस तीसरे को चालू करने में असफल रहता है, या exe, या 2 डीएल पूरी तरह से लोड करने में विफल रहता है? वास्तव में लोड करने में विफल होने के लिए चीजें प्राप्त करना एक अच्छा कदम है क्योंकि इसका मतलब है कि सिस्टम मैनिफेस्ट देख रहा है, और सिस्टम में त्रुटि, या एप्लिकेशन, कम से कम इवेंट लॉग लॉगिंग कर रहा है। यदि यह CoCreateInstance को कॉल पर असफल रहा है तो शायद यह सिर्फ मैनिफेस्ट को बिल्कुल नहीं देख सकता है। –

उत्तर

5

बस सर्वर/ग्राहक dll के प्रकट है कि के लिए अंक के लिए एक सभा निर्भरता को जोड़ने कॉम सर्वर डीएलएल।

याद रखें कि असेंबली प्रकट 'एप्लिकेशन' प्रकट करने के लिए अलग हैं: एक असेंबली मैनिफेस्ट एक असेंबली का वर्णन करता है: इसे एक नाम देता है, और इसके डीएलएस सूचीबद्ध करता है। एक अनुप्रयोग मैनिफेस्ट RT_MANIFEST एम्बेडेड संसाधन है, जो वर्तमान मॉड्यूल निर्भरताओं का वर्णन करता है।

तो, अंतिम विश्लेषण में, आप होगा:

  • app.exe, एक बाहरी (app.exe.manifest) के साथ या एम्बेडेड RT_MANIFEST एक विधानसभा पर निर्भरता का वर्णन 'acme.clientserver' कहा जाता है
  • acme.clientserver.manifest एक असेंबली का वर्णन, और पंजीकरण 'clisrv.dll' को पंजीकरण मुफ्त कॉम डीएल के रूप में सूचीबद्ध करें।
  • clisrv.dll, एक बाहरी (clisrv.dll.2.manifest) के साथ या एम्बेडेड RT_MANIFEST, एक विधानसभा 'acme.server'
  • acme.server.manifest कहा जाता है पर निर्भरता का वर्णन करते हुए एक विधानसभा का वर्णन करते हुए लिस्टिंग सर्व एक पंजीकरण मुफ्त कॉम डीएल के रूप में .dll।
  • serv.dll - जो बदले में हो सकता है या हो सकता है कि एक मेनिफेस्ट लिस्टिंग अभी तक अधिक निर्भर असेंबली न हो।

यह dll के नाम से विधानसभा कॉल करने के लिए, और दोनों विधानसभा विलय और एक साथ प्रकट DLL तकनीकी रूप से संभव है - Win32 लोडर इस का समर्थन करता है, लेकिन कुछ सेटिंग है कि आवेदन में प्रकट होता है में मान्य हैं विधानसभा प्रकट होता है में मान्य नहीं हैं , जिसके परिणामस्वरूप असेंबली लोड होने में असफल हो सकती है। यह डिजिटल हस्ताक्षर करने के लिए भी बहुत मुश्किल बनाता है।


डब्लूआरटी एक्सई के पास एक मैनिफेस्ट होना चाहिए: आमतौर पर एक्सई का मैनिफेस्ट प्रक्रियाओं को सक्रिय सक्रियण संदर्भ सेट करता है। मैं 100% निश्चित नहीं हूं कि जब एक्सई के पास कोई प्रकट नहीं होता है तो विंडोज़ कैसे व्यवहार करती है, लेकिन मुझे पूरा यकीन है कि डीएलएस में प्रकट होने पर अभी भी संसाधित किया जाएगा।

जिसका मतलब है कि CoCreateInstance में अलगाव समर्थन की कमी के कारण समस्या आती है - कुछ कारणों से - डिफ़ॉल्ट रूप से - CoCreateInstance केवल reg फ्री com प्रविष्टियों के लिए डिफ़ॉल्ट सक्रियण संदर्भ में दिखता है।

जिस तरह से यह मैन्युअल रूप से, अपने खुद के सक्रियण संदर्भ का निर्माण करने के Activation Context API

बुनियादी विधि का उपयोग कर कॉल करने के लिए किया जाएगा है ओवरराइड करने के लिए:

  • CreateActCtx - अपने DLLs प्रकट से एक सक्रियण संदर्भ बनाने के लिए ।
  • सक्रिय एक्टसीटीएक्स - संदर्भ को सक्रिय करने के लिए
  • CoCreateInstance - अब reg फ्री com प्रविष्टियों के लिए वर्तमान सक्रियण संदर्भ खोजेगा।
  • DeactivateActCtx - डिफ़ॉल्ट सक्रियण संदर्भ को पुनर्स्थापित करने के लिए।

आप जोड़ सकते हैं/डी ISOLATION_AWARE_ENABLED सबसे खिड़कियों कॉल कि किसी कारण CoCreateInstance के लिए, सक्रियण संदर्भों से प्रभावित कर रहे हैं लिपटे नहीं है रैप करने के लिए:/

+0

मेरे पास app.exe.manifest नहीं है (इसे मध्य कॉम डीएल पंजीकृत होने की आवश्यकता नहीं है)। मैंने मध्य डीएल में एक मैनिफेस्ट जोड़ने की कोशिश की, लेकिन इसका कोई फायदा नहीं हुआ। – Steve

+0

क्या आपने संसाधन संपादक (उदाहरण के लिए दृश्य स्टूडियो) में मध्य डीएल खोला है और देखा है कि इसमें RT_MANIFEST संसाधन है और इसमें क्या है? वीएस हमेशा हेक्स के रूप में RT_MANIFESTS प्रदर्शित करता है, इसलिए आपको इसे टेक्स्ट के रूप में देखने के लिए इसे निर्यात करने की आवश्यकता है। –

+0

ठीक है, ऐसा किया। डीएलएल में दो RT_Manifests हैं, जो मुझे लगता है कि संकलक (डेल्फी) द्वारा विंडोज कॉमन कंट्रोल को एक निर्भरता के रूप में नामित किया गया था, और दूसरा 1, जिसे मैंने ऊपर जोड़ा है, जिसे मैंने ऊपर दिखाया है। – Steve

संबंधित मुद्दे