2011-12-16 26 views
7

मैं एक छोटा डीएलएल घटक लिख रहा हूं जिसे डेटा को गठबंधन करने के लिए दो तृतीय पक्ष घटकों तक पहुंचने की आवश्यकता है, जिनमें से एक केवल 32 बिट है और दूसरा केवल 64 बिट है। दोनों टाइपलिब के साथ पंजीकृत हैं और स्वचालन संगत हैं, इसलिए marshalling एक मुद्दा नहीं होना चाहिए।तीसरे पक्ष के घटक के लिए COM सरोगेट

यदि मैं दस्तावेज़ीकरण को सही ढंग से समझता हूं, तो सरोगेट में लोडिंग को मजबूर करने का कोई तरीका नहीं है जब तक कि घटक में एपआईडी और डीएलएसआररोगेट कुंजी भी न हो; चूंकि दोनों तीसरे पक्ष के घटक हैं, इसलिए मैं उनके पंजीकरण को संशोधित करने में कुछ हद तक अनिच्छुक हूं।

क्या एक डीएलएल घटक से सरोगेट प्रक्रिया में एपआईड के बिना किसी घटक में किसी ऑब्जेक्ट को सक्रिय करने का कोई तरीका है, जिसका आदर्श रूप से कोई अतिरिक्त निर्भरता नहीं है, या कोई मुझे बता सकता है कि यह एक बुरा विचार क्यों होगा?

+1

http://msdn.microsoft।com/en-us/library/windows/desktop/ms682432% 28v = vs.85% 29.aspx –

+1

कस्टम सरोगेट को सर्वर घटक को एपआईड रखने की आवश्यकता नहीं होती है, इसलिए COM जानता है कि कौन सा सरोगेट कक्षा को तुरंत चालू करने के लिए है ? यदि मैं इसे जोड़ता हूं, तो यह केवल मेरे घटक को प्रभावित नहीं करेगा, बल्कि मैं इससे बचने के लिए (मानक मानक सरोगेट को ठीक काम करना चाहिए)। –

+0

[रेमंड चेन] (http://blogs.msdn.com/b/oldnewthing/archive/2009/02/12/9413816.aspx) बताता है कि एक्सप्लोरर किसी भी तरह से 'CoCreateInstance' ऑब्जेक्ट्स जो * DllSurrogate से पंजीकृत नहीं है * कुंजी ताकि वे एक सरोगेट में बनाए गए हों - मुझे दिलचस्पी होगी। –

उत्तर

6

हां, आप एक सरोगेट में केवल 32-बिट केवल डीएलएल लोड कर सकते हैं, और इसे 64-बिट प्रक्रिया से निम्न तरीके से एक्सेस कर सकते हैं। यह काम करेगा, बशर्ते एक मार्शलर उपलब्ध हो, जो आम तौर पर एक टाइपेलिब के साथ एक घटक के लिए होगा क्योंकि वे आमतौर पर मानक मार्शलर का उपयोग करते हैं। यदि ऑब्जेक्ट कस्टम प्रॉक्स/स्टब को पुनः प्राप्त करता है तो यह काम नहीं करेगा क्योंकि 64 बिट संस्करण मौजूद नहीं होंगे, या आपको पहली बार यह समस्या नहीं होगी।

सबसे पहले आपको एक एपआईड की आवश्यकता है। यदि डीएलएल में पहले से ही एक एपआईडी है, तो आपको इसका उपयोग करना चाहिए। आप CoClass के लिए CLSID कुंजी के अंतर्गत जांच करके पता लगा सकते हैं।

यहां उपयोग किया गया उदाहरण Capicom.HashedData और Capicom.EncryptedData कक्षाएं है। Capicom केवल 32-बिट है।

आपको ऐसा करने के लिए रेजीडिट के 32-बिट संस्करण का उपयोग करना चाहिए, क्योंकि यह 32-बिट घटक है। यदि आपके पास 64-बिट घटक है, तो आप 32-बिट्स से एक्सेस करना चाहते हैं, दूसरे का उपयोग करें। (यह 32-बिट संगतता परत के लिए रजिस्ट्री वर्चुअलाइजेशन की वजह से है- regedit के मिलान करने वाले बैथन संस्करण का उपयोग करके आप इस समस्या का ख्याल रखते हैं, यह सुनिश्चित करके कि आप रजिस्ट्री के सही वर्चुअलाइज्ड संस्करण को संपादित करते हैं)।

Windows Registry Editor Version 5.00 


;;; Capicom AppID - just using the Capicom.EncryptedData CLSID 
;;; Use default surrogate = empty string 
[HKEY_CLASSES_ROOT\AppID\{A440BD76-CFE1-4D46-AB1F-15F238437A3D}] 
"DllSurrogate"="" 

;;; Capicom.EncryptedData 
[HKEY_CLASSES_ROOT\CLSID\{A440BD76-CFE1-4D46-AB1F-15F238437A3D}] 
AppID="{A440BD76-CFE1-4D46-AB1F-15F238437A3D}" 

;;; Capicom.HashedData - use same AppID for all!!!!! 
[HKEY_CLASSES_ROOT\CLSID\{CE32ABF6-475D-41F6-BF82-D27F03E3D38B}] 
AppID="{A440BD76-CFE1-4D46-AB1F-15F238437A3D}" 

एक myComponent-dllhost.reg फ़ाइल के लिए सहेजें, और दूर तुम जाओ।

c:\windows\sysWow64\regedit.exe "myComponent-dllhost.reg" 

अब आप 64-बिट स्क्रिप्ट/COM मेजबानों से Capicom.HashedData और Capicom.EncryptedData उपयोग करने में सक्षम होना चाहिए।

नोट्स:

  • बुनियादी OLE स्वचालन प्रकार के लिए यह केवल काम करता है। वीबीस्क्रिप्ट या जावास्क्रिप्ट में विंडोज स्क्रिप्टिंग होस्ट स्क्रिप्ट के साथ संगत कोई ऑब्जेक्ट ठीक होना चाहिए।
  • आपको केवल ऐप आईडी को सीधे रचनात्मक वस्तुओं में जोड़ना होगा। यह मूल रूप से एक InprocServer32 प्रविष्टि के साथ है। ऑब्जेक्ट्स जो कारखानों से उत्पन्न होते हैं या जो केवल बाल वस्तुओं के रूप में उपलब्ध हैं, को एपआईड जोड़ा नहीं है।
  • यदि पहले से ही कोई ऐपआईड है तो आपको खाली-स्ट्रिंग "DllSurrogate" प्रविष्टि जोड़नी होगी। बस!
  • यह नहीं डीएलएल के सामान्य ग्राहकों को प्रभावित करेगा। जब तक बिट-नेस मैच होते हैं, तब तक वे पहले से ही प्रक्रिया में लोड होने लगेंगे। एकमात्र अंतर यह होगा कि यह एक अलग सीधा के ग्राहक से प्रक्रिया को तुरंत चालू करना संभव हो जाएगा।
+0

मेरे पास पहले से ही काम कर रहा है, लेकिन मैं अपने इंस्टॉलर से अन्य घटकों (इस मामले में, कमल नोट्स और तर्कसंगत ClearCase) के पंजीकरण को संशोधित करने में अनिच्छुक महसूस करता हूं, इसलिए मुझे आश्चर्य है कि रजिस्ट्री को संशोधित किए बिना ऐसा करने का कोई तरीका है या नहीं । –

+2

शर्मिंदा मत बनो! ओटीओएच, यदि आप वास्तव में चाहते हैं, तो आप एक ही संदिग्ध के एक सहायक कॉम ऑब्जेक्ट बना सकते हैं, जिसमें केवल एक तरीका है 'HRESULT CreateObject ([इन] BSTR प्रोगिड, [बाहर, retval] I अज्ञात ** ppRetVal)। क्या यह सरोगेट के अंदर वस्तु बनाते हैं और इसे आपके पास वापस कर देते हैं। – Ben

+0

यह एक अच्छा विचार है। –

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