2009-07-17 16 views
6

में एक COM घटक उपयोग कर सकते हैं मैं देशी सी में VisualStudio '05 में एक COM घटक ++ का उपयोग करता है एक अनुप्रयोग का निर्माण करने की कोशिश कर रहा हूँ। एमएसडीएन में चीजों के देशी और प्रबंधित desciptions के मिश्रण पूरी तरह से मेरे मस्तिष्क बर्बाद कर दिया। (मुझे लगता है कि एमएसडीएन उस सम्मान में कुल गड़बड़ है) मुझे अपने घटक को लोड करने और इसे प्रयोग करने योग्य बनाने के लिए कोड का एक छोटा और सरल देशी सी ++ नमूना चाहिए। मैं कंपाइलर बनाने वाले रैपर और पसंद के साथ ठीक हूं।कैसे मैं आसानी से मूल निवासी विज़ुअल सी ++

कृपया मुझे, आधारित MFC उदाहरण संवाद उपयोग करने के लिए क्योंकि यह इस घटक के साथ काम नहीं करता है और ग की एक बड़ी ढेर में ही है ... कोड की सलाह नहीं है।

क्या यह मूल कॉम बनाम प्रबंधित कॉम मुद्दा हो सकता है?

मैं पूरी तरह खो गया हूँ, मुझे कुछ बीयरिंग दे कृपया ...

संपादित करें: सभी मदद के लिए धन्यवाद। मेरी समस्या यह है कि मेरे पास एक पंजीकृत डीएलएल है (वास्तव में ओसीएक्स, नीचे देखें) । मैं (व्यक्तिगत रूप से) जानता हूं कि इंटरफ़ेस कैसा दिखना चाहिए, लेकिन मैं अपने प्रोग्राम को कैसे बता सकता हूं? ऐसे कोई शीर्षलेख नहीं हैं जो इंटरफेस के लिए आईडी परिभाषित कर सकें। लेकिन मैंने पढ़ा है कि सी ++ कंपाइलर निकाला जा सकता है और इसे मेरे लिए लपेट सकता है। किसी को पता है कि यह कैसे किया जाता है?

वर्गीकरण: मेरे पास केवल ओसीएक्स और घटक के दस्तावेज से एक सुराग है, इसे किस तरीके से अवगत कराया जाना चाहिए।

उत्तर

3

पूरी तरह से काम कर रहे उदाहरण (आप वास्तव में क्या जरूरत है) अपने ब्लॉग के लेख से: How to Call COM Object from Visual Studio C++?

// https://helloacm.com/how-to-call-com-object-from-visual-studio-c/ 
#include <iostream> 
#include <objbase.h> 
#include <unknwn.h> 
#include <Propvarutil.h> 
#import "wshom.ocx" no_namespace, raw_interfaces_only 

using namespace std; 

int main() { 
    HRESULT hr; 
    CLSID clsid; 
    CoInitializeEx(nullptr, COINIT_MULTITHREADED); 
    CLSIDFromProgID(OLESTR("WScript.Shell"), &clsid); 
    IWshShell *pApp = nullptr; 
    hr = CoCreateInstance(clsid, nullptr, CLSCTX_INPROC_SERVER, __uuidof(IWshShell), reinterpret_cast<LPVOID *>(&pApp)); 
    if (FAILED(hr) || pApp == nullptr) { 
     throw "Cannot Create COM Object"; 
    } 
    int out; 
    VARIANT s; 
    InitVariantFromInt32(0, &s); 
    VARIANT title; 
    InitVariantFromString(PCWSTR(L"title"), &title); 
    VARIANT type; 
    InitVariantFromInt32(4096, &type); 
    BSTR msg = ::SysAllocString(L"Hello from https://helloacm.com"); 
    pApp->Popup(msg, &s, &title, &type, &out); 
    CoUninitialize(); 
    cout << "Out = " << out; 
    return 0; 
} 
3

मैं कॉम से निपटने के लिए देशी सी ++ के साथ जाने के लिए अपने प्रयासों की सराहना - आप दर्द के माध्यम से जाने के लिए करने के लिए सही मायने में सराहना करते हैं आज के शानदार (प्रबंधित) की जरूरत है विकास के वातावरण :)

वापस जब दुनिया (और मैं) थे युवा, क्रेग ब्रॉकशमिड की पुस्तक "Inside OLE" टोम की भावना बनाने के लिए थी (COM से पहले COM भी था)। यह पुस्तक प्रबंधित कोड की भविष्यवाणी करती है, इसलिए यहां प्रबंधित भ्रम का कोई मौका नहीं है। एक दूसरा संस्करण भी है।

डॉन बॉक्स की किताबें "Essential COM" और "Effective COM" बाद में, लेकिन (अप्रबंधित) COM ज्ञान की दुकान में आपका स्वागत है।

हालांकि, अगर आपका वॉलेट इन धूल वाली पुरानी किताबों को प्राप्त करने के लिए विस्तारित नहीं होता है, तो माइक्रोसॉफ्ट COM ट्यूटोरियल सामग्री here आपको सही रास्ते पर सेट करने में मदद कर सकती है।

हैप्पी हैकिंग।

+0

खैर। धन्यवाद :)। मैं कह सकता था: "मैं नहीं पढ़ता!" लेकिन यह एक अच्छा करियर कदम नहीं होगा, यह होगा;) – AndreasT

2

एक COM वस्तु instantiating के लिए नंगे न्यूनतम इस प्रकार हैं:

1) एक COM फ्लैट उपलब्ध होना चाहिए।

यह सेटअप करने के लिए COM पुस्तकालय और प्रारंभिक कॉम फ्लैट CoInitialize/CoInitializeEx बुला अगर यह एक प्रक्रिया के लिए पहली बार है द्वारा सबसे अनुप्रयोगों के द्वारा पूरा किया है।

2) एक वस्तु बनाने के लिए CoCreateInstance/CoCreateInstanceEx कॉल करें, और निरूपित करने के लिए कि यह कैसे instantiated हो जाएगा झंडे निर्दिष्ट करें।

3) ठीक से AddRef की कॉल संतुलन और किसी भी COM घटकों आपके द्वारा बनाए गए के इंटरफेस पर रिलीज, पिछले रिलीज() जब आप एक COM घटक का उपयोग किया जाता है बुला।

-

एक प्रबंधित आवेदन में, # 1 लगभग हमेशा आप के लिए नियंत्रित किया जाता है। यदि आप COM लाइब्रेरी का संदर्भ आयात करते हैं, तो # 2 को सारणीबद्ध किया गया है, और आप केवल आयातित नामों का उपयोग कर सकते हैं जैसे कि वे .NET कक्षा परिभाषाएं और ऐसे थे। # 3 स्वचालित रूप से आपके लिए संभाला जाता है, लेकिन आपकी ज़रूरतें अलग-अलग हो सकती हैं। दुर्भाग्यवश, कभी-कभी क्विर्क होते हैं कि प्रबंधित अनुप्रयोगों में संदर्भ कैसे प्रबंधित किए जाते हैं, जिससे COM ऑब्जेक्ट्स इरादे से अधिक लंबे समय तक चिपक सकते हैं। सिस्टम में मार्शल हेल्पर क्लास। रनटाइम में ऐसी विधियां हैं जो आपको समस्याओं का सामना करने में मदद कर सकती हैं।

-

एक अप्रबंधित आवेदन में, आप अगर आप स्क्रैच से एक आवेदन पत्र बना रहे हैं कुछ शेष काम करना होगा।

  1. अपार्टमेंट को स्थापित करने के लिए अपने आवेदन के मुख्य थ्रेड में प्रारंभिक/CoInitializeEx को कॉल करें।
  2. जब आपके एप्लिकेशन का मुख्य धागा बाहर निकलने वाला है, तो अपार्टमेंट को बंद करने के लिए CoUninitialize() पर कॉल करें।
  3. आपके द्वारा बनाए गए अतिरिक्त धागे के लिए, आपको तब भी शुरू करना चाहिए जब उन्हें प्रारंभिक कोड/CoInitializeEx को कॉल करना चाहिए यदि आपको उन थ्रेडों से COM ऑब्जेक्ट्स का उपयोग करने की आवश्यकता है। इसके अलावा, आपके आवेदन के आधार पर आप अपार्टमेंट पैरामीटर सेट करना चाह सकते हैं।
  4. उन धागे के लिए, जब वे ठीक से सफाई करने के लिए बाहर निकल रहे हैं तो CoUninitialize() को भी कॉल करें।
1

यदि आप वास्तव में क्या कर रहे हैं, इसके बारे में थोड़ी अधिक जानकारी दी गई है तो इससे मदद मिलेगी। क्या आप जानते हैं कि ऑब्जेक्ट लागू करने वाले इत्यादि क्या हैं?

सामान्य रूप से, एपीआई जिसे आप अधिक विशिष्ट सहायता के लिए Google कर सकते हैं CoCreateInstance है। आपको उस ऑब्जेक्ट का GUID पास करना होगा जिसके साथ आप खेलना चाहते हैं। सभी COM ऑब्जेक्ट्स IU अज्ञात इंटरफ़ेस को लागू करते हैं, और आप किसी भी अन्य के लिए पूछ सकते हैं। आप IUnknown इंटरफ़ेस आपको ptrIUnknown से मिल गया का उपयोग करके अतिरिक्त इंटरफेस क्वेरी कर सकता है

CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); 
CoCreateInstance(CLSID, 
         ptrIUnknown, 
         ClassCxt, // generally CLSCTX_INPROC_SERVER, 
         riid , // reference id 
         (void **)&pRequest); // the interface that corresponds to the riid 

यहाँ: तो कुछ नमूने स्यूडोकोड आप की तरह कुछ लग सकता है आरंभ करने के लिए।

फिर

CoUninitialize() 

डॉन बॉक्स की असेंशियल कॉम के साथ साफ इस विषय पर एक महान किताब है। साथ ही, यह जांचने के लिए कि आपका COM ऑब्जेक्ट कैसे काम करता है, वीबीस्क्रिप्ट जैसे कुछ का उपयोग करके यह बहुत आसान बनाता है। साथ ही, यह शायद ध्यान देने योग्य है कि कक्षा आईडी का GUID कुछ असामान्य तरीके से संग्रहीत किया जाता है, इसलिए यदि आप रजिस्ट्री से GUID को छीन रहे हैं, तो आपको ऑर्डरिंग को समझने में कुछ परेशानी हो सकती है। हालांकि यह शायद एक अलग सवाल के लिए है।

+1

आवश्यक COM: +1 –

1

मैं COM वस्तुओं और घटकों के लिए एटीएल स्मार्ट COM पॉइंटर्स और एटीएल :: सीएक्सविंडो क्लास के संयोजन का उपयोग करता हूं। मुझे स्मार्ट पॉइंटर्स का उपयोग करना आसान लगता है।

http://www.murrayc.com/learning/windows/usecomfromatl.shtml

http://76.105.92.243/notes/atlcom.html#import

http://msdn.microsoft.com/en-us/library/yx242b61%28VS.80%29.aspx

+0

लिंक के लिए धन्यवाद, संख्या 2 वास्तव में आशाजनक लग रहा है। कल यह सब कुछ पार्स करने में लगेगा: | – AndreasT

+0

मुझे यह जानने में दिलचस्पी है कि किसी ने इसे क्यों वोट दिया! मैं केवल मदद करने की कोशिश कर रहा था। – Rob

+0

ठीक है और आप सफल हुए। धन्यवाद। – AndreasT

0

विज़ुअल सी से #import का उपयोग कर ++ का प्रयास करें। यह इंटरफेस के लिए स्मार्ट पॉइंटर रैपर बनाएगा।

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