Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16497246
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 20:54:37

下载本文示例代码
  序言:   这几天看了看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()函数。 共10页。 1 2 3 4 5 6 :   序言:   这几天看了看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()函数。 共10页。 1 2 3 4 5 6 : 下载本文示例代码


ATL接口映射宏详解ATL接口映射宏详解ATL接口映射宏详解ATL接口映射宏详解ATL接口映射宏详解ATL接口映射宏详解ATL接口映射宏详解ATL接口映射宏详解ATL接口映射宏详解ATL接口映射宏详解ATL接口映射宏详解ATL接口映射宏详解ATL接口映射宏详解ATL接口映射宏详解ATL接口映射宏详解
阅读(134) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~