2009-10-25 17 views
8

COM नए घटकों या अनुप्रयोगों को जारी करते समय पिछड़ा-संगतता संभव बनाने के लिए जाना जाता है। यह संभव है क्योंकि COM में इंटरफेस स्थिर हैं यानी वे नहीं बदलते हैं।एक COM इंटरफ़ेस कैसे विकसित करें?

मैंने संदर्भ या पुस्तक खोजने के लिए कड़ी मेहनत की है जो कि संस्करण से संस्करण तक COM इंटरफ़ेस को कैसे घुमाने के लिए अवरोध से संबंधित है।

निम्नलिखित मेरी आवश्यकताएँ हैं:

हम जो OLE स्वचालन के द्वारा संचालित किया जा सकता है एक आवेदन पत्र है। इस एप्लिकेशन के नए संस्करण पुराने संस्करणों में पैरारल में स्थापित किए जा सकते हैं।

इस एप्लिकेशन के COM क्लाइंट संस्करण स्वतंत्र प्रोजीआईडी ​​का उपयोग कर सकते हैं, इस मामले में वे एप्लिकेशन के नवीनतम संस्करण या संस्करण आश्रित PROGID के साथ काम करते हैं, इस मामले में वे एप्लिकेशन के विशिष्ट संस्करण के साथ काम करते हैं।

COM स्वचालन में परिवर्तन किसी भी ग्राहक को तोड़ना नहीं चाहिए।

#include <olectl.h> 
#include <fxbase\autoif.h> 

[ 
    uuid(A1B3A66F-806F-46a2-82D9-9C278F415148), 
    lcid(-1), 
    version(1.0) 
] 

library LIB 
{ 
     importlib("stdole2.tlb"); 

     [ 
      uuid(82CDE055-790A-4505-BF3E-3282170C8FC6), 
      helpstring("Document"), 
      oleautomation, 
      dual, 
      nonextensible 
     ] 
     interface IDocument : IDispatch 
     { 
       [id(0x00000001), propget, helpcontext(0x0012c94a)] 
       HRESULT Name([out, retval] BSTR* psName); 

       [id(0x00000001), propput, helpcontext(0x0012c94a)] 
       HRESULT Name([in] BSTR psName); 
     } 

     [ 
      uuid(919B9E6E-76C0-4c23-A188-5840E5900997), 
      helpstring("Application object."), 
      oleautomation, 
      dual, 
      nonextensible 
     ] 
     interface IApplication : IDispatch 
     { 
      [id(0x00000001), propget, helpstring("Returns the active document of the application.")] 
      HRESULT ActiveDocument([out, retval] IDocument** retval); 
     } 

     [ 
      uuid(E0AA6FCA-AEF1-460b-A1F9-26250C28594B), 
      helpstring("Application 1.0 Class"), 
      appobject 
     ] 
     coclass Application 
     { 
      [default] interface IApplication; 
           interface IDispatch; 
     } 
} 

चलें कहते हैं कि मैं इस आवेदन जो कुछ इंटरफेस फैली के संस्करण 2.0 प्रकाशित करना चाहते हैं:

एक उदाहरण देखते हैं।

#include <olectl.h> 
#include <fxbase\autoif.h> 

[ 
    uuid(3D4688A2-91F8-4cd8-989A-845810A05557), 
    lcid(-1), 
    version(2.0) 
] 

library LIB 
{ 
     importlib("stdole2.tlb"); 

     [ 
      uuid(82CDE055-790A-4505-BF3E-3282170C8FC6), 
      helpstring("Document"), 
      oleautomation, 
      dual 
     ] 
     interface IDocument10 : IDispatch 
     { 
       [id(0x00000001), propget, helpcontext(0x0012c94a)] 
       HRESULT Name([out, retval] BSTR* psName); 

       [id(0x00000001), propput, helpcontext(0x0012c94a)] 
       HRESULT Name([in] BSTR psName); 
     } 

     [ 
      uuid(AF404510-216A-407e-99F4-0636AF071B68), 
      helpstring("Document"), 
      oleautomation, 
      dual, 
      nonextensible 
     ] 
     interface IDocument : IDocument10 
     { 
       [id(0x00000001), propget, helpcontext(0x0012c94a)] 
       HRESULT Type([out, retval] BSTR* psType); 

       [id(0x00000001), propput, helpcontext(0x0012c94a)] 
       HRESULT Type([in] BSTR psType); 
     } 

     [ 
      uuid(919B9E6E-76C0-4c23-A188-5840E5900997), 
      helpstring("Application object."), 
      oleautomation, 
      dual 
     ] 
     interface IApplication10 : IDispatch 
     { 
      [id(0x00000001), propget, helpstring("Returns the active document of the application.")] 
      HRESULT ActiveDocument([out, retval] IDocument** retval); 
     } 

     [ 
      uuid(6A851C3F-21DF-4f5e-A4D6-2EF5A9D234C6), 
      helpstring("Application object."), 
      oleautomation, 
      dual, 
      nonextensible 
     ] 
     interface IApplication : IApplication10 
     { 
      [id(0x00000002), propget, helpstring("Is the application visible.")] 
      HRESULT Visible([out, retval] BOOL* retval); 
     } 

     [ 
      uuid(AA760349-1682-4ab6-BF0C-C02E620715CF), 
      helpstring("Application 2.0 Class"), 
      appobject 
     ] 
     coclass Application 
     { 
      [default] interface IApplication; 
           interface IDispatch; 
     } 
} 

है इस यह करने के लिए सही तरीका: यहाँ संस्करण 2.0 में मेरी भोली दृष्टिकोण है?

क्या मुझे स्क्रिप्ट क्लाइंट के लिए एप्लिकेशन के विभिन्न संस्करणों को तुरंत चालू करने के लिए एक संभावितता जोड़ने के लिए रजिस्ट्री में कक्षा 10 और एप्लिकेशन 20 जोड़ना चाहिए?

क्या लाइब्रेरी के GUID संस्करण और को बदलने का अधिकार है?

संस्करण 2.0 में आईडी दस्तावेज़ में एक नया आईआईडी है। क्या मैं अभी भी IAplication.ActiveDocument में IDocument का उपयोग कर सकता हूं?

मुझे विभिन्न संस्करणों में विंडोज रजिस्ट्री में कोकलास या इंटरफ़ेस को कैसे पंजीकृत करना चाहिए?

कृपया ध्यान दें कि मैं WIN32-API के अलावा अन्य एटीएल या अन्य पुस्तकालयों का उपयोग नहीं करता हूं।

यदि आप जानते हैं कि मुझे इस पर जानकारी कहां मिल सकती है (किताबें, संदर्भ इत्यादि) कृपया एक सुझाव दें।

मैं आपकी मदद की सराहना करता हूं।

उत्तर

10

हां, यदि आप एकाधिक संस्करणों को सह-अस्तित्व में रखना चाहते हैं तो आपको अपने ऑब्जेक्ट के class id को बदलने की आवश्यकता है। हालांकि आप एक संस्करण-स्वतंत्र program id "Word.Aplication" या "InternetExplorer.Aplication" जैसे redirects to the class id of the current version बनाए रख सकते हैं। पिछड़ा संगतता बनाए रखने के लिए बहुत मुश्किल है। एमएसएक्सएमएल ने स्पष्ट रूप से संस्करण-स्वतंत्र प्रोजेड का अभ्यास छोड़ दिया।

यदि आप पुराने इंटरफेस (अनुशंसित) रखने का निर्णय लेते हैं, तो आपको अपनी नई वस्तु में नए और पुराने इंटरफेस दोनों को लागू करने की आवश्यकता है।

आप माइक्रोसॉफ्ट ऑफिस की रजिस्ट्री entires की जांच कर सकते हैं। यह पिछड़े संगतता को अच्छी तरह से बनाए रखता है।

नए इंटरफेस का सुझाए गए नाम इंटरफेक्ट नाम और संस्करण संख्या, जैसे कि IHtmlDocument6 होगा।

+0

मैं वास्तव में माइक्रोसॉफ़्ट ऑफिस रजिस्ट्री प्रविष्टियों से सीखना चाहता हूं लेकिन मेरे पास पुराना संस्करण नहीं है। क्या आप सीखने के लिए फ्रीवेयर प्रोग्राम जानते हैं? – frast

+0

सीएलएसआईडी को बदलने के लिए क्यों जरूरी है? कार्यान्वयन अभी भी किए गए सभी इंटरफेस को लागू करेगा, है ना? –

+0

@ फास्ट या आईई की जांच करें। –

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