我要投稿
  • 您当前的位置:365bet官方 -> 技术教程 -> 软件开发教程 -> C语言教程 -> 教程内容
  • [ 收藏本页教程 ]
  • ATL接口映射宏详解C语言教程

    教程作者:佚名    教程来源:不详   教程栏目:C语言教程    收藏本页
      这几天看了看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()函数。



    我要投稿   -   广告合作   -   关于本站   -   友情连接   -   网站地图   -   联系我们   -   版权声明   -   设为首页   -   加入收藏   -   网站留言
    Copyright © 2009 - 20012 www.www.ct131.com All Rights Reserved.365bet官方 版权所有