WEB开发网
开发学院软件开发VC 用ATL建立轻量级的COM对象(6) 阅读

用ATL建立轻量级的COM对象(6)

 2006-07-21 11:44:26 来源:WEB开发网   
核心提示: 虽然你可以显式地定义用于对象映射的各种函数,通常的方法是将 CComCoClass 添加到你自己类的基类列表中,用ATL建立轻量级的COM对象(6)(3),CComCoClass 是一个模板类,它有两个模板参数:你自己的类名和对应的 CLSID 指针,不论哪种情况,支持聚合都不需要实际的编

虽然你可以显式地定义用于对象映射的各种函数,通常的方法是将 CComCoClass 添加到你自己类的基类列表中。CComCoClass 是一个模板类,它有两个模板参数:你自己的类名和对应的 CLSID 指针。它添加适当的类型定义和静态成员函数来提供对象映射必须的功能。下面的代码示范了 CComCoClass 的使用: class CPager
 : public CComObjectRootEx,
  public CComCoClass,
  public IPager
{
public:
BEGIN_COM_MAP(CPager)
  COM_INTERFACE_ENTRY(IPager)
END_INTERFACE_MAP()
  STDMETHODIMP SendMessage(const OLECHAR * pwsz);
}; 
一旦你从CComCoClass派生,你的类就已经被添加到ATL Object Map中。ATL所提供的用来简化建立对象映射的宏很像接口映射宏。下面就是为多CLSID服务器建立的一个对象映射。 BEGIN_OBJECT_MAP(ObjectMap)
  OBJECT_ENTRY(CLSID_Pager, CPager)
  OBJECT_ENTRY(CLSID_Laptop, CLaptop)
END_OBJECT_MAP()
   
这个代码建立了一个叫 ObjectMap 的 _ATL_OBJMAP_ENTRY 数组,初始化如下:

static _ATL_OBJMAP_ENTRY ObjectMap[] = {
{ &CLSID_Pager, &CPager::UpdateRegistry,   
&CPager::_ClassFactoryCreatorClass::CreateInstance, 
&CPager::_CreatorClass::CreateInstance, NULL, 0, 
&CPager::GetObjectDescription 
},
{ &CLSID_Laptop, &CLaptop::UpdateRegistry,   
&CLaptop::_ClassFactoryCreatorClass::CreateInstance, 
&CLaptop::_CreatorClass::CreateInstance, NULL, 0, 
&CLaptop::GetObjectDescription 
},
{ 0, 0, 0, 0 } };  
 

静态成员函数从 CComCoClass 派生,被隐含式定义。以上定义的对象映射一般通过使用 CComModule 的 Init 方法被传递到ATL:

_Module.Init(ObjectMap, hInstance);
   
这个方法根据创建的服务器类型,在 DllMain 或 WinMain 中被调用。

缺省情况下,CcomCoClass 为你的类提供了一个标准的类工厂,允许客户端聚合你的对象。你可以通过添加下面的类定义代码行来改变缺省的聚合行为: DECLARE_NOT_AGGREGATABLE(CPager)
   DECLARE_ONLY_AGGREGATABLE(CPager)
   DECLARE_POLY_AGGREGATABLE(CPager)
   
  这些宏只是将 ATL Creator 定义成一个将被用于初始化对象映射的嵌套类型(CreatorClass)。前面两个宏是自解释的(它们禁止或需要聚合)。 第三个宏需要解释一下。缺省情况下,CComCoClass 使用 ATL 类创建机制,根据是否需要使用聚合来创建两个不同的类之一。如果不需要聚合,则创建新的 CComObject 实例。如果需要聚合,则创建新的CComAggObject实例。也就是说两个不同的 vtables 必须在可执行文件中出现。对照之下,DECLARE_POLY_ AGGREGATABLE 总是创建一个 CComPolyObject 实例,并根据对象是否聚合来初始化这个外部控制指针。亦即只要定义一个C++类,只需一个 vtable。这个技术的不足之处是:非聚合对象的每个实例必须为非代理 IUnknown 指针多用4个字节。不论哪种情况,支持聚合都不需要实际的编码,而只是在实例和代码大小之间作出取舍。(待续)

上一页  1 2 3 

Tags:ATL 建立 轻量级

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接