网站大量收购独家精品文档,联系QQ:2885784924

ATL接口映射宏详解(上).doc

  1. 1、本文档共22页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
ATL接口映射宏详解(上)

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()函数。 2: STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) { return _Module.GetClassObject(rclsid, riid, ppv)

文档评论(0)

mg60065 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档