ATL接口映射宏详解

失落的风sky

失落的风sky

2016-01-29 12:41

ATL接口映射宏详解,ATL接口映射宏详解
  这几天看了看ATL的接口映射宏,不知不觉看得比较深入了,突然就萌发了把它写出来的想法。ATL中定义了很多接口映射宏,有几个还是比较重要的,虽然好象没有必要把它所有的细节都弄得很清楚,但深入学习的过程中也可以顺带学一学其他的ATL类,对它的机制也可以更清楚一些,应该还是会有些好处的吧。我按照我学习的过程把它写出来,也 不知道大家能不能看懂。想模仿一下侯老师的手笔力争把其内部细节解释清楚,但也不敢大言不惭的美其名曰“深入浅出”,呵呵,只希望能对大家有所帮助了。

  以后将分别介绍ATL中各个形式为COM_INTERFACE_ENTRY_XX的接口映射宏并将按照从易到难的顺序讲解,每一部分都将建立在前一部分的基础上。每一部分都将通过分析实际的调用函数堆栈来进行分析,堆栈的写法是从下向上。文中所涉及的代码都为略写,只列出相关部分。

  一、COM_INTERFACE_ENTRY(x)

  首先我们从一个最典型的应用开始:

  定义一个最简单的ATL DLL:

class ATL_NO_VTABLE CMyObject :
public CComObjectRootEx,
public CComCoClass,
public IDispatchImpl
{
    .....
    BEGIN_COM_MAP(CMyObject)
        COM_INTERFACE_ENTRY(IMyObject) //一个双接口
        COM_INTERFACE_ENTRY(IDispatch)
    END_COM_MAP()
    .....
};
  编写一段最简单的查询接口代码:

IUnknown *pUnk;
IMyObject *pMyObject;
CoCreateInstance(CLSID_MyObject, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)&pUnk);
pUnk->QueryInterface(IID_IMyObject, (void **)&pMyObject);
  执行客户代码,首先我们看看组件对象是如何被创建的。

  函数调用堆栈一:

  4...........
  3.ATL::CComCreator< ATL::CComObject< CMyObject > >::CreateInstance(...)
  2.ATL::CComCreator2< ATL::CComCreator< ATL::CComObject< CMyObject > >,
          ATL::CComCreator< ATL::CComAggObject< CMyObject > > >::CreateInstance(...)
  1.ATL::CComClassFactory::CreateInstance(...)
  4.ATL::AtlModuleGetClassObject(...)
  9.ATL::AtlInternalQueryInterface(...)
  8.ATL::CComObjectRootBase::InternalQueryInterface(...)
  7.ATL::CComClassFactory::_InternalQueryInterface(...)
  6.ATL::CComObjectCached::QueryInterface(...)
  5.ATL::CComCreator >::
  CreateInstance(...)
  4.ATL::AtlModuleGetClassObject(...)
  3.ATL::CComModule::GetClassObject(...)
  2.DllGetClassObject(...)
  1.CoCreateInstance(...)(客户端)
  解释如下:

1:

CoCreateInstance(CLSID_MyObject, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)&pUnk);
其内部将调用OLE API函数CoGetClassObject(), 而CoGetClassObject则会通过 LoadLibrary(...)装入DLL,并调用DLL中的DllGetClassObject()函数。


展开更多 50%)
分享

猜你喜欢

ATL接口映射宏详解

C语言教程 C语言函数
ATL接口映射宏详解

Photoshop中详解渐变映射的创建

PS PS教程
Photoshop中详解渐变映射的创建

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

硬盘的接口类型的详解

电脑入门
硬盘的接口类型的详解

ATL/COM简单工程

编程语言 网络编程
ATL/COM简单工程

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

C++十六进制宏的用法详解

编程语言 网络编程
C++十六进制宏的用法详解

ATL的GUI程序设计(4)ATL的窗口类

编程语言 网络编程
ATL的GUI程序设计(4)ATL的窗口类

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

《海贼王 无尽世界 红》详细白金攻略

《海贼王 无尽世界 红》详细白金攻略

《灵魂献祭Delta》连携技能详解 单人及多人连携

《灵魂献祭Delta》连携技能详解 单人及多人连携
下拉加载更多内容 ↓