ATL 中增加双接口

来源:互联网 发布:淘宝小样 编辑:程序博客网 时间:2024/06/11 04:52

atl中增加双接口的过程有:

1 修改IDL文件:增加接口的描述


    [
        object,
        uuid(692D03A4-C689-11CE-B337-88EA36DE9E4E),
        dual,
        helpstring("IMotion interface")
    ]
    interface IMotion : IDispatch
    {
      HRESULT Fly();
   HRESULT GetPosition([out,retval]long* nPosition);
 };

    [
        object,
        uuid(692D03A5-C689-11CE-B337-88EA36DE9E4E),
        helpstring("IVisual interface")
    ]
    interface IVisual : IUnknown
    {
         HRESULT Display();
    };

//ps:书上一句 "再次通过MIDL编译器运行IDL. MIDL编译器将产生一个新的Spaceshipsvr.h,其中包含了IMotion和IVisual的纯抽象基类,对本菜鸟产生严重误导,以为其他一切都自动了..

2 修改BEGIN_COM_MAP()宏 避免 IDispatch的冲突

原来是这个样子di:
BEGIN_COM_MAP(CClassicATSpaceShip)
 COM_INTERFACE_ENTRY(IClassicATSpaceShip)
 COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()

改成
BEGIN_COM_MAP(CClassicATSpaceShip)
 COM_INTERFACE_ENTRY(IClassicATSpaceShip)
 COM_INTERFACE_ENTRY2(IDispatch,IClassicATSpaceShip) //这里会避免请求IDispatch的时候冲突
    COM_INTERFACE_ENTRY(IMotion)
    COM_INTERFACE_ENTRY(IVisual)
END_COM_MAP()

3,让class继承这些接口

在class的父类中加入这么几个:

    public IDispatchImpl<IMotion, &IID_IMotion,
                         &LIBID_ClassicATLSpaceShipSvrLib>,
    public IDispatchImpl<IVisual, &IID_IVisual,
                         &LIBID_ClassicATLSpaceShipSvrLib>

4.增加函数声明 定义

在.h文件中增加

    STDMETHOD(Fly)();
    STDMETHOD(GetPosition)(long* lPosition);

    STDMETHOD(Display)();

在.cpp文件中增加


STDMETHODIMP CClassicATSpaceShip::Fly()
{
    AtlTrace("Flying the Classic ATL object/n");
    return S_OK;
}

STDMETHODIMP CClassicATSpaceShip::GetPosition(long* lPosition)
{
    AtlTrace("Getting the position of the Classic ATL object/n");
    *lPosition = m_lPosition;
    return S_OK;
}

STDMETHODIMP CClassicATSpaceShip::Display()
{
    AtlTrace("Displaying the classic ATL object/n");
    return S_OK;
}

 

大致上来说,就是这么几个过程,都要手动增加,没有wizard,一切都只有你的双手..

 

现在我严重鄙视 visual c++.net 技术内幕,翻译不到位,动不动还有 "-"出现 例如:

ClassicATL-Spaceship.cpp

编译了IDL文件以后会得到一个相应的.h文件,里面是纯虚类(在当前例子中就会包含 IMotion 和IVsiaul)

默认情况下这个.h是没有被包含在 project里面的,project中会使用include包含这个.h文件(用于模板类生继承)

原创粉丝点击