2010-10-24 14 views
7

मेरे पास एक COM DLL (कहना है, xyz.dll) वीसी ++ में कोडित है। मैं एक कॉलिंग EXE एप्लिकेशन (calling.exe) बनाना चाहता हूं जो COM DLL (xyz.dll) के कार्यों को कॉल करेगा।वीसी ++ .EXE एप्लिकेशन से COM DLL (VC++ में) के फ़ंक्शंस को कैसे कॉल करें?

मैंने http://www.codeproject.com/kb/DLL/XDllPt1.aspx लिंक में दिए गए चरणों का पालन किया। लेकिन मैं डीएलएल और EXE को कनेक्ट करने में सक्षम नहीं हूं और इसलिए COM DLL के कार्यों को कॉल करने में सक्षम नहीं हूं। मैं COM और VC++ प्रोग्रामिंग के लिए बिल्कुल नया हूं। क्या कोई कृपया मेरी मदद कर सकता है। एक समाधान DLL परियोजना होने बनाया गया (xyz:

मैं दृश्य स्टूडियो का उपयोग कर रहा 2005.

ये सटीक चरण मैं पीछा किया --------

कदम 1 हैं .dll) प्रोजेक्ट और टेम्पलेट एमएफसी एप्लिकेशन (संवाद आधारित) के कॉलर एप्लिकेशन प्रोजेक्ट (calling.exe)। स्टार्टअप प्रोजेक्ट के रूप में इस कॉलिंग.एक्सई को बनाया गया ..

चरण 2: समाधान एक्सप्लोरर में call.exe प्रोजेक्ट पर राइट क्लिक करके गुणों के पास गया। विन्यास गुण -> C/C++ -> जनरल -> अतिरिक्त निर्देशों और DLL परियोजना के लिए पथ जोड़ा ..

चरण 3 को शामिल करें: calling.exe आवेदन पर फिर से राइट क्लिक परियोजना गुणों -> कॉन्फ़िगरेशन गुण -> लिंकर -> इनपुट -> अतिरिक्त निर्भरता और ने निर्मित DLL प्रोजेक्ट के लिए .ib फ़ाइल को जोड़ा।

चरण 4:calling.exe आवेदन पर राइट क्लिक करें परियोजना, गुण -> आम गुण -> संदर्भ -> DLL में जोड़ा संदर्भ।

कदम 5:आवेदन परियोजना निर्देशिका के लिए xyz.dll फ़ाइल को कॉपी किया गया।

चरण 6: मेरी डीएलएल में कई शीर्षलेख फ़ाइलें और इसकी संबंधित स्रोत फ़ाइलें हैं। इसलिए, DLL प्रोजेक्ट में मौजूद सभी शीर्षलेख फ़ाइलों को मेरे calling.exe एप्लिकेशन प्रोग्राम में जोड़ा गया। OnInitDialog() फ़ंक्शन के भीतर call.exe एप्लिकेशन के .CPP प्रोग्राम में से एक में मौजूद है, मैंने DLL के कार्यों को बुलाया।

बस बयान

Cx objname; objname.func();

यहां सीएक्स डीएलएल में कक्षा का नाम है।

मैंने EXISTING DLL प्रोजेक्ट की कॉन्फ़िगरेशन सेटिंग्स के साथ कोई परिवर्तन नहीं किया क्योंकि यह डीएलएल है जो पहले से ही एक विशेषज्ञ द्वारा तैयार किया गया है और मैं इस डीएलएल में मौजूद कार्यों को कॉल करने के लिए सिर्फ कॉलिंग एप्लायंस लिख रहा हूं।

अग्रिम में धन्यवाद।

उत्तर

10

आपके द्वारा अनुसरण किए गए निर्देश सामान्य डीएलएल में काम करने के लिए हैं, COM DLL नहीं। COM DLL तक पहुंचने के लिए आपको COM के माध्यम से जाना होगा।

आप DLL की lib फ़ाइल से लिंक नहीं करते हैं या किसी भी शीर्षलेख को शामिल नहीं करते हैं, और आपको DLL को स्थानांतरित करने की आवश्यकता नहीं है।

सबसे पहले, सुनिश्चित करें कि DLL regsvr32 चलाकर पंजीकृत है।

regsvr32 "c:\..\..\xyz.dll" ; insert the correct path 

फिर, अपनी परियोजना के stdafx.h के लिए एक #import निर्देश जोड़ने DLL करने के लिए पथ हैं। फ़ाइल को ध्यान में रखते

#import "c:\..\..\xyz.dll" // insert the correct path 

राइट क्लिक करें Stdafx.cpp और संकलन चुनें। यह आपके डीएलएल तक पहुंचने के लिए आवश्यक रैपर "स्मार्ट पॉइंटर" कक्षाएं उत्पन्न करेगा। स्मार्ट पॉइंटर वर्गों में आपके डीएलएल में इंटरफेस के समान नाम हैं, लेकिन अंत में "पीटीआर" के साथ।

एक .tlh एक्सटेंशन के साथ फ़ाइल को देखें और अपनी डीबग निर्देशिका में अपने डीएलएल के समान नाम देखें। यह एक सी ++ नेमस्पेस घोषणा के साथ शुरू होता है। यह नामस्थान है जिसमें आप डीएलएल से बना वस्तुओं को बनाने जा रहे हैं।

कहो नाम स्थान है XYZ और आप एक Cx वस्तु है, जो Ix इंटरफेस को उजागर करता है का दृष्टांत करना चाहते हैं। आप करना होगा:

try { 
    XYZ::IxPtr obj; 
    obj.CreateInstance(__uuidof(XYZ::Cx)); 
    obj->func(); 
} catch (_com_error e) { 
    printf("Error: %S\n", e.Description()); 
    printf("Error: %S\n", e.ErrorMessage()); 
} 

फिर आप सिर्फ एक साधारण सूचक की तरह उपयोग करने के लिए जारी कर सकते हैं। जब आप इसके साथ समाप्त कर चुके हैं तो आप इसे हटा नहीं देते हैं, हालांकि यह दायरे से बाहर होने पर स्वचालित रूप से नष्ट हो जाएगा।

+0

stdafx.h में अन्य सभी शीर्षकों से पहले अपना # आयात करें। –

+0

हाय मार्टिन आपकी तरह की मदद के लिए बहुत बहुत धन्यवाद। मैंने आपके कंसोल वीसी ++ एप्लिकेशन से डीएलएल के कार्यों को सफलतापूर्वक आपके द्वारा दिए गए चरणों का पालन करके बुलाया ... – codeLover

+0

आपका स्वागत है। अगर आप इससे खुश हैं तो मेरा जवाब स्वीकार करें (इसके आगे टिक पर क्लिक करें)। –

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