我正在做一个绘制几何图形的控件。我通过下面的形式组织数据:
CShape:public CCmdTarget{}//自动化类, 从CCmdTarget继承,实现IShape接口
CLine:public CShape //自动化类,从CShape继承,实现ILine接口
CRectangle:public CShape //自动化类,从CShape继承,实现IRectangle接口
...... //其他类似于CLine和CRectangle的类
在控件中有分别返回IShape*类型和ILine*类型的指针的方法:
LPDISPATCH CMyCtl::Func1(/*...params...*/)
{
CShape* pshape;
pshape=new CShape();
...//some statements
return pshape->GetIDispatch(true);
}
LPDISPATCH CMyCtl::Func2(/*...params...*/)
{
CLine* pline;
pline=new CLine();
...//some statements
return pline->GetIDispatch(true);
}
LPDISPATCH CMyCtl::Func2_ex(/*...params...*/)
{
CLine* pline;
CShape * pshape;
pline=new CLine();
pshape=(CShape*)pline
...//some statements
return pshape->GetIDispatch(true);
}
容器程序在加入控件时wizard为IShape和ILine产生了包装类:
class CShape : public COleDispatchDriver
class CLine : public COleDispatchDriver
症状:
在容器程序中使用返回值时有区别:
1) CShape someshape(ctrl.Func1());
someshape.xxx();//此时调用方法成功。
2) CLine someline(ctrl.Func2());
someline.yyy();//此时调用方法失败。
3) CShape someshape(Func2_ex());
someshape.xxx()//此时调用方法失败。
//容器程序报错信息为:“未知的界面”
问题及思考:
我在控件中我需要使用继承来维护正常的逻辑关系,我这样使用继承正确吗?
如果正确,我在容器中怎样才能获取正确的line和rectangle对象呢?
否则,我应该怎样实现这种继承的逻辑呢?
CShape:public CCmdTarget{}//自动化类, 从CCmdTarget继承,实现IShape接口
CLine:public CShape //自动化类,从CShape继承,实现ILine接口
CRectangle:public CShape //自动化类,从CShape继承,实现IRectangle接口
...... //其他类似于CLine和CRectangle的类
在控件中有分别返回IShape*类型和ILine*类型的指针的方法:
LPDISPATCH CMyCtl::Func1(/*...params...*/)
{
CShape* pshape;
pshape=new CShape();
...//some statements
return pshape->GetIDispatch(true);
}
LPDISPATCH CMyCtl::Func2(/*...params...*/)
{
CLine* pline;
pline=new CLine();
...//some statements
return pline->GetIDispatch(true);
}
LPDISPATCH CMyCtl::Func2_ex(/*...params...*/)
{
CLine* pline;
CShape * pshape;
pline=new CLine();
pshape=(CShape*)pline
...//some statements
return pshape->GetIDispatch(true);
}
容器程序在加入控件时wizard为IShape和ILine产生了包装类:
class CShape : public COleDispatchDriver
class CLine : public COleDispatchDriver
症状:
在容器程序中使用返回值时有区别:
1) CShape someshape(ctrl.Func1());
someshape.xxx();//此时调用方法成功。
2) CLine someline(ctrl.Func2());
someline.yyy();//此时调用方法失败。
3) CShape someshape(Func2_ex());
someshape.xxx()//此时调用方法失败。
//容器程序报错信息为:“未知的界面”
问题及思考:
我在控件中我需要使用继承来维护正常的逻辑关系,我这样使用继承正确吗?
如果正确,我在容器中怎样才能获取正确的line和rectangle对象呢?
否则,我应该怎样实现这种继承的逻辑呢?
虚表:
CShape
IDispatch
IShape
CLine
IShape::IDispatch
IShape
ILine::IDispatch
ILine
CRectangle也类似,这里类型转换 (CShape *)pline 将返回 IShape::IDispatch,因此需要(ILine *)pline取ILine::IDispatch,至于GetDispatch,它使虚表走上COM正轨。
请问,那怎么才能返回ILine::IDispatch呢?
我是不是要这样使用包容:
CLine
{
private:
CShape m_shape;
}
或使用聚合?
1.难道把wizard帮我生成的IShape和ILine重命名为IIShape和IILine问题就解决了?
2.接口是类,地球人都知道.
3.CIILine是什么东东?mfc嵌套实现的com是在接口前面加X,而且被屏蔽了,用不了也不需要啊!按照你说的CLine实现IILine接口,怎么接口包含com对象的实例?我不太明白你在讲什么.