windows - Register 32-bit COM server (and generate TLB) for use with 32-bit and 64-bit clients -


विधि 1: x 86 लक्ष्य प्लेटफ़ॉर्म

मेरे पास एक .NET वर्ग है लाइब्रेरी जो कि 32-बिट और 64-बिट दोनों क्लाइंट के साथ उपयोग के लिए लक्षित है, जिनमें से कुछ हैं। NET परियोजनाएं और जिनमें से कुछ सी + + एमएफसी परियोजनाएं हैं मैं 32-बिट क्लाइंट के साथ काम करने के लिए पुस्तकालय प्राप्त कर सकता हूं, लेकिन 64-बिट क्लाइंट को एक "क्लास पंजीकृत नहीं किया गया" अपवाद मिलता है। रजिस्ट्री के आसपास पोकिंग, ऐसा लगता है कि केवल Win32 कुंजी को सेट किया जा रहा है (HKEY_CLASSES_ROOT \ Wow6432Node \ TypeLib {GUID} \ 1.0 \ 0 \ win32)।

मेरी कुछ सेटिंग्स पर कुछ नोट्स:

  • "विजुअल COM-Visible बनाएँ" चेक किया गया है।
  • "प्लेटफ़ॉर्म लक्ष्य" x86 है। < / Li>
  • लायब्रेरी में एक 32-बिट अप्रबंधित DLL है जो DLLImport के साथ विधियों को लोड करता है।
  • सी ++ एमएफसी क्लाइंट का उपयोग #import "MyLibrary.tlb" को मार्शल करने के लिए इंटरॉप कोड।
  • मैंने COM को समर्थन देने के लिए कोड में कोई परिवर्तन नहीं किया है (उदाहरण, मैंने सिस्टम ओवरराइड नहीं किया है। कॉन्फ़िगरेशन। इंस्टॉल करें। इंस्टॉलर। इंस्टॉल करें)

    इसे सुलझाने के प्रयास में मैंने कुछ शोध और जांच के आधार पर कई चीजों की कोशिश की है।

    विधि 2: "किसी भी सीपीयू" लक्ष्य मंच

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

    विधि 3: मेरे पुस्तकालय की अप्रबंधित DLL निर्भरता का 64-बिट बिल्ड प्राप्त करें

    इस के आसपास काम करने के लिए, मैं संभावित रूप से अप्रबंधित DLL के 64-बिट बिल्ड को पकड़ सकता है। हालांकि, हमने एक तृतीय पक्ष से यह डीएलएल खरीदा है, और जो भी कारण, वे डीएलएल के 64-बिट निर्माण के लिए एक बड़ा, अतिरिक्त शुल्क लेते हैं। स्पष्ट लागत के ऊपर, मुझे यह भी करना होगा और कॉल करना होगा कि क्या यह 32-बिट या 64-बिट है, जो मेरे आवरण वर्ग में कई तरीकों को दोगुना कर देगा। इस प्रकार, जब यह संभव समाधान है, यह वांछनीय से दूर है, और COM के बारे में मैं जो समझता हूं, यह आवश्यक नहीं होना चाहिए।

    विधि 4: regsvr32.exe < / p>

    सबसे आम समाधान मैं इसके लिए ऑनलाइन खोज रहा हूँ regsvr32.exe का उपयोग करने के लिए मैन्युअल रूप से एक 32-बिट और 64-बिट इंटरॉप दोनों के लिए एक आवेदन रजिस्टर करें। हालांकि, मुझे अपने एमएफसी क्लाइंट्स के साथ इंटरऑपरेबिलिटी के लिए टीएलबी फाइल की आवश्यकता है, और।

    विधि 5: regasm.exe

    टीएलबी फ़ाइल पाने के लिए और उम्मीद है कि दोनों 32-बिट और 64-बिट इंटरॉप के लिए पंजीकरण करें, मैंने भी विधानसभा मैन्युअल रूप से रजिस्टर करने के लिए regasm.exe का उपयोग करने की कोशिश की है। मैंने ऐसा करने के लिए निम्न कमांड का प्रयोग किया है।

    "% WINDIR% \ Microsoft.NET \ Framework64 \ v4.0.30319 \ regasm.exe" "डी: \ पथ \ करने के लिए \ MyLibrary.dll" / Tlb / nologo

    हालांकि, यह पंजीकृत केवल 64-बिट COM सर्वर और win32 COM रजिस्ट्री कुंजी अनुपलब्ध है। अब मेरा 32-बिट क्लाइंट COM सर्वर नहीं खोज सकता है और "क्लास पंजीकृत नहीं है।" इसके अलावा, 64-बिट क्लाइंट के लिए, मुझे वही त्रुटि मिलती है जिसे मैंने देखा था जब मैंने "कोई सीपीयू" चुना था: "गलत प्रारूप के साथ प्रोग्राम को लोड करने का प्रयास किया गया था।"


    टीएल; डीआर मैं दोनों 32-बिट और 64-बिट क्लाइंट अनुप्रयोगों के साथ प्रयोग के लिए एक 32-बिट COM सर्वर कैसे पंजीकृत करूं? (ध्यान दें कि मुझे टीएलबी फ़ाइल की आवश्यकता है, और सर्वर को अप्रबंधित, 32-बिट डीएलएल लोड करने की जरूरत है।)


    मुझे लगता है मुझे यहां आर्किटेक्चर को स्पष्ट करना चाहिए। यहां एक आरेख है जो दर्शाता है कि मैं इन घटकों को कैसे कार्य करना चाहता हूं।

    छवि विवरण यहां दर्ज करें

    जैसा कि आप देख सकते हैं, मुझे कॉम सर्वर के द्वारा 32-बिट कोड के साथ इंटरैक्ट करने के लिए 64-बिट कोड की आवश्यकता है, जो कि @ एमसी-एनडी नोट्स के रूप में काम करना है। मुझे अपने COM सर्वर को इसका समर्थन करने के लिए कैसे कॉन्फ़िगर करना चाहिए?

    से

    64-बिट विंडोज पर, 64-बिट प्रक्रिया 32-बिट डायनेमिक-लिंक लाइब्रेरी (डीएलएल) लोड नहीं कर सकती है। इसके अतिरिक्त, 32-बिट प्रक्रिया 64-बिट डीएलएल लोड नहीं कर सकती

    आपका सबसे अच्छा विकल्प आपके कॉन्ट्रैक्ट कॉम्बल को कॉम सर्वर से 32 बिट के रूप में संकलित कर रहा है।

  • Comments

    Popular posts from this blog

    Verilog Error: output or inout port "Q" must be connected to a structural net expression -

    jasper reports - How to center align barcode using jasperreports and barcode4j -

    c# - ASP.NET MVC - Attaching an entity of type 'MODELNAME' failed because another entity of the same type already has the same primary key value -