• 1023阅读
  • 3回复

com-IClassFactory [复制链接]

上一主题 下一主题
离线啊冲
 

只看楼主 倒序阅读 使用道具 楼主  发表于: 2016-03-09

ClassFactory的作用是创建COM组件。

我们已经知道COM组件实际上就是一个类,那我们平常是怎么实例化一个类对象的?是用'new’命令!很简单吧,COM组件也一样如此。但是谁来new它呢?不可能是客户程序,因为客户程序不可能知道组件的类名字,如果客户知道组件的类名字那组件的可重用性就要打个大大的折扣了,事实上客户程序只不过知道一个代表着组件的128位的数字串而已,这个等会再介绍。所以客户无法自己创建组件,而且考虑一下,如果组件是在远程的机器上,你还能new出一个对象吗?所以创建组件的责任交给了一个单独的对象,这个对象就是类厂。

每个组件都必须有一个与之相关的类厂,这个类厂知道怎么样创建组件,当客户请求一个组件对象的实例时,实际上这个请求交给了类厂,由类厂创建组件实例,然后把实例指针交给客户程序。这个过程在跨进程及远程创建组件时特别有用,因为这时就不是一个简单的new操作就可以的了,它必须要经过调度,而这些复杂的操作都交给类厂对象去做了。

IClassFactory最重要的一个函数就是CreateInstance,顾名思议就是创建组件实例,一般情况下我们不会直接调用它,API函数都为我们封装好它了,只有某些特殊情况下才会由我们自己来调用它,这也是VC编写COM组件的好处,使我们有了更多的控制机会,而VB给我们这样的机会则是太少太少了。[backcolor=url(http://hgy413.com/wordpress/wp-content/plugins/wp-codebox/images/view_code.png) 0% 50% no-repeat]View Code TEXT

123456789101112IClassFactory : public IUnknown{public:virtual /* [local] */ HRESULT STDMETHODCALLTYPE CreateInstance(/* [unique][in] */ IUnknown *pUnkOuter,/* [in] */ REFIID riid,/* [iid_is][out] */ void **ppvObject) = 0; virtual /* [local] */ HRESULT STDMETHODCALLTYPE LockServer(/* [in] */ BOOL fLock) = 0; };

善者 慈悲心常在 无怨无恨 以苦为乐
默认压缩密码www.hifyl.com
文件分享密码问题:http://www.hifyl.com/read-htm-tid-4444.html
离线xuaneye

只看该作者 沙发  发表于: 2016-04-17
离线v2680267313

只看该作者 板凳  发表于: 2016-04-30
用户被禁言,该主题自动屏蔽!
离线qq1156136807

只看该作者 地板  发表于: 2017-12-29
快速回复
限100 字节
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
 
上一个 下一个