हां, आप एक सरोगेट में केवल 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" प्रविष्टि जोड़नी होगी। बस!
- यह नहीं डीएलएल के सामान्य ग्राहकों को प्रभावित करेगा। जब तक बिट-नेस मैच होते हैं, तब तक वे पहले से ही प्रक्रिया में लोड होने लगेंगे। एकमात्र अंतर यह होगा कि यह एक अलग सीधा के ग्राहक से प्रक्रिया को तुरंत चालू करना संभव हो जाएगा।
http://msdn.microsoft।com/en-us/library/windows/desktop/ms682432% 28v = vs.85% 29.aspx –
कस्टम सरोगेट को सर्वर घटक को एपआईड रखने की आवश्यकता नहीं होती है, इसलिए COM जानता है कि कौन सा सरोगेट कक्षा को तुरंत चालू करने के लिए है ? यदि मैं इसे जोड़ता हूं, तो यह केवल मेरे घटक को प्रभावित नहीं करेगा, बल्कि मैं इससे बचने के लिए (मानक मानक सरोगेट को ठीक काम करना चाहिए)। –
[रेमंड चेन] (http://blogs.msdn.com/b/oldnewthing/archive/2009/02/12/9413816.aspx) बताता है कि एक्सप्लोरर किसी भी तरह से 'CoCreateInstance' ऑब्जेक्ट्स जो * DllSurrogate से पंजीकृत नहीं है * कुंजी ताकि वे एक सरोगेट में बनाए गए हों - मुझे दिलचस्पी होगी। –