随笔 - 25  文章 - 29  trackbacks - 0
<2006年7月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

常用链接

留言簿(4)

随笔分类(22)

随笔档案(25)

文章分类(2)

文章档案(2)

相册

最新随笔

搜索

  •  

积分与排名

  • 积分 - 54494
  • 排名 - 407

最新评论

阅读排行榜

评论排行榜

  1 #pragma once
  2 static   const  GUID CLSID_mydiv  =  
  3 0x41443b3 0xe38f 0x403d 0xad 0xe7 0x64 0x6e 0x16 0x67 0x10 0x77  }  } ;
  4 //  {977CF9DA-1373-4534-B70B-A1897BD33C7C}
  5 static   const  GUID IID_Idiv  =  
  6 0x977cf9da 0x1373 0x4534 0xb7 0xb 0xa1 0x89 0x7b 0xd3 0x3c 0x7c  }  } ;
  7
  8 //  {8E8A627A-D2F8-4692-8C96-CEB9EB4734C1}
  9 static   const  GUID CLSID_mydivfactory  =  
 10 0x8e8a627a 0xd2f8 0x4692 0x8c 0x96 0xce 0xb9 0xeb 0x47 0x34 0xc1  }  } ;
 11 //   [7/4/2006 hyk]
 12 ///////////////////////////////// Cmydiv 包容了 IAdd,ISubcat 接口
 13 //   [7/4/2006 hyk]
 14
 15 extern    int  m_comobjnum;
 16 extern    int  m_lock;
 17 class  Idiv: public  IUnknown
 18 {
 19 public :
 20      virtual   int  __stdcall div( int , int ) = 0 ;
 21      /* virtual int __stdcall add(int,int)=0;
 22     virtual int __stdcall sub(int,int)=0; */

 23 protected :
 24 private :
 25 }
;
 26 class  Cmydiv: public  Idiv, public  IAdd, public  ISubcat
 27 {
 28 public :
 29     Cmydiv()
 30      {
 31         m_ref = 0 ;
 32         m_comobjnum ++ ;
 33         padd = NULL;
 34         psubcat = NULL;
 35     }

 36      ~ Cmydiv()
 37      {
 38
 39         padd -> Release();
 40    
 41         
 42         psubcat -> Release();
 43         m_comobjnum -- ;
 44
 45
 46     }

 47     HRESULT init()
 48      {  
 49         HRESULT hr = ::CoCreateInstance(CLSID_myadd,NULL,CLSCTX_INPROC_SERVER,IID_IAdd,( void ** ) & padd);
 50          if  (FAILED(hr))
 51          {
 52               return  E_FAIL;
 53         }

 54          // hr=::CoCreateInstance(CLSID_myadd,NULL,CLSCTX_INPROC_SERVER,IID_ISubcat,(void**)&psubcat);
 55         hr == padd -> QueryInterface(IID_ISubcat,( void ** ) & psubcat);
 56          if  (FAILED(hr))
 57          {
 58              return  E_FAIL;
 59         }

 60          return  S_OK;
 61     }

 62     HRESULT __stdcall QueryInterface(REFIID riid,  void   ** ppvObject)
 63      {
 64          if  (riid == IID_IAdd)
 65          {
 66                   * ppvObject = padd;
 67                  AddRef();
 68                   return  S_OK;
 69         }
else   if  (riid == IID_ISubcat)
 70          {
 71                    * ppvObject = psubcat;
 72                    return  S_OK;
 73         }
else   if  (riid == IID_Idiv)
 74          {
 75              * ppvObject = (Idiv  * ) this ;
 76              return  S_OK;
 77
 78         }
else   if  (riid == IID_IUnknown)
 79          {
 80              * ppvObject = (Idiv  * ) this ;
 81              return  S_OK;
 82         }

 83          else
 84              return  E_FAIL;
 85     }

 86     ULONG  __stdcall AddRef()
 87      {
 88          // cout<<"\n"<<typeid(*this).name();
 89          ++ m_ref;
 90         cout << " \n Cmydiv object ref count ++= " << m_ref;
 91          return  m_ref;
 92     }

 93     ULONG  __stdcall Release()         
 94      {
 95          // cout<<"\n"<<typeid(*this).name();
 96          -- m_ref;
 97         cout << " \n Cmydiv object ref count --= " << m_ref;
 98          if  (m_ref == 0 )
 99          {
100             delete  this ;
101             cout << " \n object delete " ;
102         }

103          return  m_ref;
104     }

105      int  __stdcall add( int  a , int  b )
106      {
107               return   padd -> add(a,b);
108     }

109      int  __stdcall sub( int  a, int  b )
110      {
111                  return   psubcat -> sub(a,b);
112     }

113      int  __stdcall div( int  a, int  b)
114      {
115          return  a / b;
116     }

117 protected :
118 private :
119      int  m_ref;
120     IAdd  *  padd;
121     ISubcat  *  psubcat;
122 }
;
123 class   Cmydivfactory: public  IClassFactory
124 {
125 public :
126     Cmydivfactory()
127      {
128         m_ref = 0 ;
129         
130     }

131      ~ Cmydivfactory()
132      {
133
134     }

135       HRESULT __stdcall QueryInterface(REFIID riid,  void   ** ppvObject)
136        {
137            if  (riid == IID_IClassFactory)
138            {
139                * ppvObject = (IClassFactory *  ) this ;
140               AddRef();
141                return  S_OK;
142           }
else
143            return  E_NOINTERFACE;
144              
145       }

146       ULONG __stdcall AddRef()
147        {
148            ++ m_ref;
149            return  m_ref;
150
151       }

152       ULONG __stdcall Release()
153        {
154            -- m_ref;
155            if  ( ! m_ref)
156            {
157               delete  this ;
158           }

159            return  m_ref;
160       }

161       HRESULT __stdcall CreateInstance(IUnknown  *  pUnknownOuter,  const  IID &  iid,  void   ** ppv)
162        {
163         Cmydiv   *  pObj;   
164           HRESULT hr;
165
166            * ppv = NULL;
167           hr = E_OUTOFMEMORY;
168            if  (NULL  !=  pUnknownOuter)
169                return  CLASS_E_NOAGGREGATION;
170
171            // Create the object passing function to notify on destruction.
172           pObj = new  Cmydiv;
173            if  (NULL == pObj)
174                return  hr;   
175                 hr = pObj -> init();
176                  if  (FAILED(hr))
177                  {
178                      return  hr;
179                 }

180            // Obtain the first interface pointer (which does an AddRef)
181           hr = pObj -> QueryInterface(iid, ppv);
182
183            if  (hr  !=  S_OK)  {
184                // Kill the object if initial creation or FInit failed.
185               m_comobjnum  -- //  Reference count g_cDictionary be added in constructor
186               delete pObj;
187           }

188
189            return  hr;   
190       }

191       HRESULT __stdcall LockServer(BOOL fLock)
192        {
193            if  (fLock)
194            {
195               m_lock ++ ;
196           }
else
197               m_lock -- ;
198            return  S_OK;
199       }

200 protected :
201
202 private :
203      int  m_ref;
204 }
;
205
       A要重用 实现2个接口  ,a,b,  则A 继承 a,b,并要改写 a,b 函数,增加 a,b 2个指针,在初始化
中获取 a,b 接口指针 ,在析构中释放。
   关于类厂要注意的是,类厂guid,在客户文件中并不需要,仅仅在组件中使用,也不进入注册表(进程
中的组件)
           对象计数和锁计数,其中对象计数一般可以不包含类厂
                  以这种方式来实现重用,更体现 接口的概念,
                           客户端只需要 接口头文件, 接口iid,com类clsid
posted on 2006-07-04 16:20 黄大仙 阅读(634) 评论(0)  编辑 收藏 引用 所属分类: c++

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理