关于类厂的疑问[zz]

关于类厂的疑问  
 
书上讲,类厂本身也是一个COM对象,COM库通过类厂创建COM对象;每一个COM对象类应该有一个相应的类厂对象。  
 
我的疑问是:“类厂”  和  “类厂对象”  是不是同一个东西?若不是,它们有什么不同?  
---------------------------------------------------------------  
 
类厂是一个概念,是类似一种类型,类厂对象是该类型的一个实例化的东西  
---------------------------------------------------------------  
 
下面讲的就非常好  
 
IClassFactory的作用是创建COM组件。我们已经知道COM组件实际上就是一个类,那我们平常是怎么实例化一个类对象的?是用‘new’命令!很简单吧,COM组件也一样如此。但是谁来new它呢?不可能是客户程序,因为客户程序不可能知道组件的类名字,如果客户知道组件的类名字那组件的可重用性就要打个大大的折扣了,事实上客户程序只不过知道一个代表着组件的128位的数字串而已,这个等会再介绍。所以客户无法自己创建组件,而且考虑一下,如果组件是在远程的机器上,你还能new出一个对象吗?所以创建组件的责任交给了一个单独的对象,这个对象就是类厂。  
  每个组件都必须有一个与之相关的类厂,这个类厂知道怎么样创建组件,当客户请求一个组件对象的实例时,实际上这个请求交给了类厂,由类厂创建组件实例,然后把实例指针交给客户程序。这个过程在跨进程及远程创建组件时特别有用,因为这时就不是一个简单的new操作就可以的了,它必须要经过调度,而这些复杂的操作都交给类厂对象去做了。  
  IClassFactory最重要的一个函数就是CreateInstance,顾名思议就是创建组件实例,一般情况下我们不会直接调用它,API函数都为我们封装好它了,只有某些特殊情况下才会由我们自己来调用它,这也是VC编写COM组件的好处,使我们有了更多的控制机会,而VB给我们这样的机会则是太少太少了。  
 
---------------------------------------------------------------  
 
有什么好迷惑不解的  
“类厂”就是一个com对象的定义,  “类厂”就是类厂的一个实例  
一个com对象对应一个类厂,com对象由类厂对象创建  
类厂对象一般在DllGetClassObject中被创建  
例如  
extern  "C"  HRESULT  __stdcall  DllGetClassObject(const   CLSID&   clsid,  const  IID&  iid,  void  **ppv)  
{  
if  ( clsid  ==   CLSID_Dictionary  )  {  
 
CDictionaryFactory  *pFactory  =  new  CDictionaryFactory;  
 
if  (pFactory  ==  NULL)  {  
return  E_OUTOFMEMORY  ;  
}  
 
HRESULT  result  =  pFactory->QueryInterface(iid,  ppv);  
 
return  result;  
}  else  {  
return  CLASS_E_CLASSNOTAVAILABLE;  
}  
}  
 
 
---------------------------------------------------------------  
 
呵呵,楼主后面的问题可以参考  
http://expert.csdn.net/Expert/TopicView1.asp?id=2458893  
 
由于楼主使用MFC,类厂的实例是在CWinApp派生类的InitInstance中的  
COleObjectFactory::RegisterAll  
中实现的。  
---------------------------------------------------------------  
 
请看MSDN中有一段话  
 
类对象  
这个类对象是一个特殊的  COM  对象,它的主要目的是实现  IClassFactory  接口。(您将经常听到这个对象被引用为“类厂”,甚至“类厂对象”,但是更准确地应该引用为类对象。)  
 
所以说,“类厂”  和  “类厂对象”  实际上都叫做  “类对象” 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值