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文件(用于模板类生继承)