2010-09-07 11 views
6

क्या आप एक उदाहरण प्रदान कर सकते हैं कि तुलना के माध्यम से एटीएल का लाभ दिखाता है?लोग COM प्रोग्रामिंग के लिए एटीएल का उपयोग क्यों करते हैं?

+1

किसके साथ तुलना? – Johnsyweb

+3

एटीएल का उपयोग नहीं करने के लिए। – wamp

उत्तर

3

डेवलपर्स आलसी हैं और चीजों को पसंद करते हैं जो कठिन हैं, और एटीएल को COM विकास को आसान बनाने के लिए डिज़ाइन किया गया था।

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

यदि आप एटीएल का उपयोग नहीं करते हैं, या ऐसा कुछ, तो आप बहुत अधिक कोड लिखेंगे। यही कारण है कि दुर्भाग्यपूर्ण हो सकता है;)

संपादित करें:

मैं क्योंकि यह ऐसा करने के लिए इतना खराब है एक उदाहरण के लिए ATL के बिना किसी भी COM कोड लिखने, लेकिन इस की जाँच करने के लिए नहीं जा रहा हूँ:

http://www.codeproject.com/KB/COM/simplecomserver.aspx

डाउनलोड कि और फिर simplecomserver परियोजना के तहत निम्न फ़ाइलों को देखो:

registry.cpp

simplecomserverImpl.cpp

(कोड के 700 लाइनों के आसपास)

अब कल्पना है कि उस कुरूपता के सभी लिखने की बजाय, आप CCoComClass से एक वर्ग प्राप्त कर सकता है और सिर्फ नाम विधि को लागू करें, और फिर संभाल करने ऐसा करने कक्षा तत्काल और पंजीकरण:

// Used to determine whether the DLL can be unloaded by OLE 
STDAPI DllCanUnloadNow(void) 
{ 
    return _AtlModule.DllCanUnloadNow(); 
} 


// Returns a class factory to create an object of the requested type 
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) 
{ 
    return _AtlModule.DllGetClassObject(rclsid, riid, ppv); 
} 


// DllRegisterServer - Adds entries to the system registry 
STDAPI DllRegisterServer(void) 
{ 
    // registers object, typelib and all interfaces in typelib 
    HRESULT hr = _AtlModule.DllRegisterServer(); 
    return hr; 
} 


// DllUnregisterServer - Removes entries from the system registry 
STDAPI DllUnregisterServer(void) 
{ 
    HRESULT hr = _AtlModule.DllUnregisterServer(); 
    return hr; 
} 
+0

क्या आप एक उदाहरण प्रदान कर सकते हैं? – wamp

+0

क्या एक उदाहरण है? – Gerald

+0

विकास को आसान बनाने के लिए एटीएल का उपयोग करना? – wamp

7

ऐसा लगता है कि आप कुछ ठोस उदाहरण चाहते हैं जहां एटीएल COM प्रोग्रामिंग को सरल बनाता है; निम्नलिखित मेरे लिए क्या हुआ है।

  • CComObjectRootEx: CComObjectRootEx से अपने कॉम कक्षाएं पाने रखकर आप मिल धागा सुरक्षित संदर्भ की गिनती नि: शुल्क।

  • CComCoClass: इस आधार वर्ग अपनी कक्षा instantiating, IClassFactory सामान है कि ग्राहकों को अपनी घटक के साथ CoGetClassObject का उपयोग करने के लिए आवश्यक है शामिल करने के लिए सभी तरीकों लागू करता है।

  • COM_INTERFACE_ENTRY मैक्रो: ATL BEGIN_COM_MAP और END_COM_MAP के बीच का उपयोग करने के, जो आप अपनी आवश्यकताओं को, जो कुछ भी वे हो सकता है के लिए सही ढंग से IUnknown::QueryInterface की हिम्मत लागू करने के लिए उपयोग कर सकते हैं मैक्रो की एक पूरी गुच्छा प्रदान करता है।

  • IDispatchImpl: यदि आप अपने घटकों को स्क्रिप्ट के लिए सुलभ बनाना चाहते हैं, तो आपको IDispatch लागू करना होगा। एटीएल IDispatchImpl कक्षा प्रदान करता है, जो इसे स्वयं लागू करने की परेशानी बचाता है।

  • CComPtr/CComQIPtr: ATL इन स्मार्ट सूचक कक्षाएं, जो IUnknown::AddRef, IUnknown::Release और IUnknown::QueryInterface के लिए कॉल को संपुटित प्रदान करता है।उनका उपयोग करने से आपका कोड पढ़ने में आसान हो जाएगा और COM संदर्भ-गिनती बग के लिए कम प्रवण होगा।

  • CComBSTR/CComVariant: ATL इन कक्षाओं में है, जो BSTR और VARIANT कॉम प्रकार से निपटने की जटिलता को कम करती है।

+0

एटीएल का उपयोग करने के लिए मुझे कौन सी हेडर फाइल/लाइब्रेरीज़ शामिल करने की आवश्यकता है? – wamp

+1

यह एक अलग प्रश्न की तरह लगता है ..... :) –

+0

क्या मुझे अभी भी ** एटीएल ** पर स्विच करने के लिए 'CoInitialize (NULL)' और 'CoUninitialize() 'कॉल करने की आवश्यकता है? – wamp

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

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