总结[zz]

我总结了一下COM程序实现的过程,   希望有人能受益,有人能提提意见.  
   
  Com   Implement   Process  
   
  1.   组件程序要实现并导出函数DllRegisterServer()来注册组件到注册表中,该例程把CLSID_Ditionary注册到注册表中  
  2.   客户程序调用CoInitialize(NULL)来初始化COM库  
  3.   客户程序调用CoCreateInstance(CLSID_Dictionary,   NULL,   CLSCTX_INPROC_SERVER,   IID_IUnknown,   (void   **)&pUnknown);  
            1)定义一个IClassFactory接口的指针,IClassFactory   *pCF;  
            2)调用CoGetClassObject(CLSID_Dictionary,   CLSCTX_INPROC_SERVER,   NULL,   IID_IClassFactory,   (void   *)pCF)    
                        A.   从注册表中找到由CLSID_Dictionary所指定的COM对象(dll),并装入dll程序  
                        B.   调用DllGetClassObject(CLSID_Dictionary,   IID_IClassFactory,   pCF)   创建类厂  
                                  a.   定义一个类厂的对象指针:CDictionaryFactory   *pFactory   =   new   CDictionaryFactory;  
                                  b.   用类厂的对象指针调用QueryInterface取得类厂对象的IID_IClassFactory接口指针:   pFactory->QueryInterface   (IID_IClassFactory,   pCF);  
                                  c.   把得到的类厂接口指针pCF返回给DllGetClassObject(...,   pCF);  
                        C.   DllGetClassObject(...,   pCF)函数把类厂接口指针pCF返回给CoGetClassObject(...,   pCF)  
          3)CoGetClassObject(...,   pCF)把类厂接口指针pCF返回给CoCreateInstance(...,   pUnknown)的pCF;  
          4)用类厂接口指针pCF调用类厂CDictionaryFactory的函数CreateInstance()来创建COM对象:    
  pCF->CreateInstance(NULL,   IID_IUnknown,   (void   **)&pUnknown);  
                      //注1:pFactory->QueryInterface   (IID_IClassFactory,   pCF);       这样得到的pCF可用来创建COM对象  
                      //注2:pFactory->QueryInterface   (IID_IClassFactory2,   pCF);   这样得到的pCF可用来在创建COM对象时验证用户的许可证情况(更高级些)但需要类厂类CDictionaryFactory由IClassFactory2接口派生  
                      //注3:由于CDictionaryFactory是由IClassFactory接口派生,IClassFactory接口的GUID为IID_IClassFactory,   所以pFactory->QueryInterface   (IID_IClassFactory,   pCF)返回的pCF指向IClassFactory接口,即可以调用IClassFactory接口的函数,但这些函数的实现在派生类CDictionaryFactory中。比如pCF可以调用从IClassFactory类中派生出来的CreateInstance()函数。总之就是一个接口的指针只能调用自己接口所具有的函数。  
           
          4)//接上页的4)  
  A. 定义一个客户真正需要的COM对象的指针   CDictionary   *pObj     =   new   CDictionary();  
  B. 调用CDictionary的QueryInterface()(//IUnknown   member   function):   pObj->QueryInterface   (IID_IUnknown,   (void   **)&pUnknown);  
  //注:IUnknown   *pUnknown说明pUnknown是IUnknown类型的指针,但CDictionary   的QueryInterface()返回的pUnknown是IDictionary   *类型的或ISpellCheck   *类型的,但当pUnknown从pObj->QueryInterface()返回给pUnknow时会直接转换成IUnknown   *类型的。  
  C.   类厂指针的操作   pCF->Release()   //待续  
                        D.把在B中创建的真正要用的COM对象的接口的指针(IUnknown   *类型的指针)返回给CoCreateInstance(…)的pUnknown   .  
  4.客户用pUnknown指针直接调用COM对象中的函数    
  1)   IUnknown   *pUnknown;  
  IDictionary   *pDictionary;  
  ISpellCheck   *pSpellCheck;  
  2)   pUnknown->QueryInterface(IID_Dictionary,   (void   **)&pDictionary);  
        pDictionary->QueryInterface(IID_SpellCheck,   (void   **)&pSpellCheck);  
  3)   pDictionary->LoadLibrary(L”animal.dict”)                   //IDictionary的函数  
        pSpellCheck->CheckWord(L”lion”,   &stringResult);     //ISpellCheck的函数  
         
            //注:pUnknown是IUnknown   *类型的,IUnknown是IDictionary,ISpellCheck这两个接口的基类接口,所以可以用pUnknown调用QueryInterface()来获得IDictionary,ISpellCheck的接口指针,从而可以调用在CDictionary中的相应的函数。注意,IDictionary的接口指针只能调用CDictionary从IDictionary接口继承的函数,不能调用ISpellCheck的函数。同理ISpellCheck   .  
  5.客户调用CoUninitialize(),在程序退出前,终止COM库服务函数。  
   
  如果有想和我一起学习和联系的:   mkqu@comgi.com  
                                                              32532824   
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值