200分!(不过不知道怎么给200分)如何用ATL实现类ADO的对象树?比如通过 A.B.C 来访问一个对象?

coinicon 2004-08-04 12:31:44
如何用ATL实现类ADO的对象树?

此问题包括两个方面内容:

1。如何通过一个接口 A 访问另一个接口 B,且只能通过 A 访问,从表现上来看,B 为 A 在对象树中的子节点?

2。如何实现对象(非基本数据类型)的集合、枚举?比如ADO中的Fields,RecordSets等。

两个问题各100分!
...全文
73 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jim3000 2004-08-07
  • 打赏
  • 举报
回复
做这种集合类很常见的,很简单,你看看书就明白了。
假如你实现了一个点组件(CPoint,接口为IPoint),想实现一个点集合组件(CPoints,接口为IPoints),可以这样做:

在Points.h文件里定义一个点的数组类
typedef std::vector<ISPoint*> VecPoints;

在CPoints中定义成员变量,用于保存点接口
VecPoints m_vecPoints;

在IPoints接口中实现几个基本的方法和属性:
Add([in]IPoint* pPoint); //增加一个新点,引用记数+1
Remove([in]long Index); //删除指定的点,引用记数-1
Count([out, retval] long *pVal);//取的点的个数
Item([in]long Index, [out, retval] IPoint* *pVal);//返回指定的项,引用记数+1
RemoveAll();//所有的引用记数-1

要注意引用记数的增加和释放!!在FinalRelease()中要调用RemoveAll()


coinicon 2004-08-07
  • 打赏
  • 举报
回复
非常感谢两位!

-------------------
mg1616(内网网站:neweb.dhcn.net) :
只能通过 A 访问 B 恐怕不可能

例如Office程序的对象,一般都是以Application为对象树的根,其他对象只能通过Application访问或创建,如何类似实现呢?

-------------------
jim3000(jim):
2.定义这个对象的集合接口并实现,定义枚举类型在接口中直接应用

有无具体例子提供呢?我就是卡在实现对象集合的问题上了,写的代码可能不对,编译都通不过。

=========
再次感谢二位!!
coinicon 2004-08-07
  • 打赏
  • 举报
回复
谢谢!

对于集合对象,必须实现的方法、属性有Count、Item、_NewEnum,对于Count、Item以及附加的Add,Remove,RemoveAll等方法,实现应该不难,但对于_NewEnum,则有些困难,因_NewEnum得到的IEnumVARIANT必须实现Clone等方法。

jim3000(jim)的实现,需要自己手动写较多代码,且容易出错,而ATL框架中提供了辅助类,如ICollectionOnSTLImpl,_Copy,_CopyInterface,我的意思是,如何利用这些辅助类在ATL的框架内快速简洁地实现对象集合?

还望jim3000(jim)不奢指教。
jim3000 2004-08-06
  • 打赏
  • 举报
回复
这是ATL很基本的问题了,所以高手懒得回答。
1.将B以包容或聚合的方式在A中实现,将C以包容或聚合的方式在B中实现
2.定义这个对象的集合接口并实现,定义枚举类型在接口中直接应用
mg1616 2004-08-06
  • 打赏
  • 举报
回复
1。在接口A之前声明接口B,A的属性类型为接口B,但只能通过 A 访问 B 恐怕不可能。

2。对象集合应该是接口属性加参数,作为对象的索引值,比如A.B[1],或者A.B["ID"],枚举就有待研究了
coinicon 2004-08-06
  • 打赏
  • 举报
回复
没人回答,难道csdn的高手都不上网了吗?

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧