手机版

COM编程入门(19)

发布时间:2021-06-06   来源:未知    
字号:

COM编程入门,十分浅显易懂

大括弧和连字符是必不可少的,字母大小写均可。

这个键的默认值是人可值别的组件对象类名,使用VC所带的OLE/COM对象浏览器可以察看到它们。在GUID键的子键中还可以存储其它信息。需要创建什 么子键依赖于COM服务器的类型以及COM服务器的使用方法。对于本文例子中这个简单的进程内服务器,我们值需要一个子 键:InProcServer32。

InProcServer32键包含两个串:这两个串的缺省值是服务器DLL的全路径和线程模型值(ThreadingModel)。线程模型超出了 本文所涉及的范围,我们先接受这个概念,这里我们指的是单线程服务器,用的模式为Apartment(即单线程公寓)。

创建COM对象——类工厂

回首看一看客户端的COM,它是如何以自己独立于语言的方式创建和销毁COM对象。客户端调用CoCreateInstance()创建新的COM对象。现在我们来看看它在服务器端是如何工作的。

你每次实现组件对象类的时候,都要写一个旁类负责创建第一个组件对象类的实例。这个旁类就叫这个组件对象类的类工厂(class factory),其唯一目的是创建COM对象。之所以要一个类工厂,是因为语言无关的缘故。COM本身并不创建对象,因为它不是独立于语言的也不是独立 于实现的。

当某个客户端想要创建一个COM对象时,COM库就从COM服务器请求类工厂。然后类工厂创建COM对象并将它返回客户端。它们的通讯机制由函数

DllGetClassObject()来提供。

术语 “类工厂”和“类对象”实际上是一回事。没有那个单词能精确描述类工厂的作用和义,但正是这个工厂创建了COM对象,而不是COM类所为。将“类工厂”理 解成“对象工厂”可能会更有助于理解(实际上MFC就是这样理解的——它的类工厂实现就叫做COleObjectFactory)。但“类工厂”是正式术 语,所以本文也这样用。

当COM库调用DllGetClassObject()时,它传递客户端请求的CLSID。服务器负责为所请求的CLSID创建者各类工厂并将它返 回。类工厂本身就是一个组件对象类,并且实现IClassFactory接口。如果DllGetClassObject()调用成功,它返回一个 IClassFactory指针给COM库,然后COM库用IClassFactory接口方法创建客户端所请求的COM对象实例。 一下是IClassFactory接口: struct IClassFactory : public IUnknown

{

HRESULT CreateInstance( IUnknown* pUnkOuter, REFIID riid, void** ppvObject );

HRESULT LockServer( BOOL fLock );

};

其中,CreateInstance()是创建COM对象的方法。LockServer()在必要时让COM库增加或减少服务器的引用计数。

一个定制接口的例子

COM编程入门(19).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
×
二维码
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)