大家都知道我们的组件都是继承IUnknown,
那么,addref是不是也是我们的组件实现??
如何实现一个组件继承另外一个组件。 例如:
idl中:
interface IA : IDispatch
...
interface IB : IA
...
这个如何实现。 大家去看看ado 类型库中微软的做法:
interface _ADO : IDispatch {//定义公用接口
[id(0x000001f4), propget, helpcontext(0x0012c900)]
HRESULT Properties([out, retval] Properties** ppvObject);
}; interface Command15 : _ADO
interface Connection15 : _ADO
哪位指点1 2。
分不够可以再加!! 时间紧任务急!!!
解决方案 »
- 如何使子对话框能透明显示他父窗口上的内容
- 双网卡取ip(重分请教)
- 那位大侠有,好用的皮肤呀,能给小弟发个吗!
- 如何使用SOCKET来获取局域网内所有的主机????
- 关于vc++中使用结构体的问题,它怎么和我想的结果不一样呢???
- 我不想使用LoadImage获得图象,该怎么做才能得到DIB的数据??
- 100分***兄弟们手把手教我搞一个DLL吧,就把x,y中最大的打出来
- 求助,关于线程不卡UI的方案。
- 把十进制转换成十六进制用哪个函数?
- 我在用Serialize有疑问,CArchive 和CFile的区别!
- 请高手列出vc编程的几个学习重点及学vc人的几大发展方向
- 100分求助!!!socket被阻塞,是否接受缓冲不够大?
比如你要实现 interface _ADO,那么在你的类里要实现
_ADO的所有method和property.
2.IVehicle和ICar能否做到一个项目里?
{
public:
HRESULT Drive();
};
是的,经你提醒,看书的时候的确是曾经看过这么一节内容,不过我很菜,用的是ATL,所以还是有几个问题问你:>> 1.IVehicle的函数怎么做成纯虚函数?virtual HRESULT Drive() = 0;class ICar : public IVehicle
{
public:
HRESULT Drive();
};如果用ATL的话,这些语句加到那个文件里,是IDL么?还是单独自己做一个文件?有没有省劲点的方法?
我直接用一个接口继承另外一个
然后再相应的组件实现class中手工添加函数 但是,编译就有问题。
不过还没有搞定。http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnguion/html/msdn_093098.asp
http://www.codeproject.com/atl/com_atl.asphttp://www.codeproject.com/atl/
http://expert.csdn.net/Expert/topic/1901/1901677.xml?temp=.6865503
拿分,可以不回答问题,要不哪一百分就浪费了,哈哈
1)idl中IDrived直接IBase;
Interface:IDrived:IBase
2) 父子的方法中id不能重复3) 组件的头文件中
使用COM_INTERFACE_ENTRY2(IBase,IDrived) 把对于父接口的map2到子接口中4) 手工添加(组件类的.h .cpp文件中)
父接口的声明和实现认识和思考:
为什么要map2?
原因:多重继承的结果我们的组件中有多个父接口的vtable(完全相同)
我们必须使用哪一个,哪个都可以--因为完全相同 什么时候map2?
只要出现了多重继承,就使用:map:IBase-->IDerived OK总结完毕请来点掌声!!!
vc客户端调用说“不支持这个接口”// TTT.h : Declaration of the CTTT#ifndef __TTT_H_
#define __TTT_H_#include "resource.h" // main symbols/////////////////////////////////////////////////////////////////////////////
// CTTT
class ATL_NO_VTABLE CTTT :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CTTT, &CLSID_TTT>,
public IDispatchImpl<ITTT, &IID_ITTT, &LIBID_INHERITTESTLib>//,
//public IDispatchImpl<ITTT0, &IID_ITTT0, &LIBID_INHERITTESTLib>
//public ITTT1
{
public:
CTTT()
{
}DECLARE_REGISTRY_RESOURCEID(IDR_TTT)DECLARE_PROTECT_FINAL_CONSTRUCT()BEGIN_COM_MAP(CTTT)
COM_INTERFACE_ENTRY2(IDispatch,ITTT0)//COM_INTERFACE_ENTRY2IDispatch,ITTT)也可以
COM_INTERFACE_ENTRY2(ITTT0,ITT)
COM_INTERFACE_ENTRY(ITTT)//<<-----加上这行就可以了
END_COM_MAP()// ITTT
public:
STDMETHOD(test1)();
STDMETHOD(test0)();
STDMETHOD(get_www2)(/*[out, retval]*/ long *pVal);
STDMETHOD(put_www2)(/*[in]*/ long newVal);
STDMETHOD(get_wwww1)(/*[out, retval]*/ long *pVal);
STDMETHOD(bbbb)();
STDMETHOD(aaaa)();
STDMETHOD(get_SSS)(/*[out, retval]*/ long *pVal);
STDMETHOD(put_SSS)(/*[in]*/ long newVal);// ITTT0
private:
long m_nWww2;
long m_nSSS;};#endif //__TTT_H_说明:
接口关系
ITTT:ITTT0