VC Com编程笔记 [2004年7月5日 14:58]

来源:互联网 发布:c语言数据类型大小 编辑:程序博客网 时间:2024/05/16 06:09

这几天一直在考虑接下来应该学什么呢?

犹豫来犹豫去,什么都想学,总想做个比较大一点的东西,本来想给自己做个网站,JDK装了,Tomcat装了,JAVA知识不够,一切都需要从零开始。昨天晚上一个激灵,突然又想把在公司学到的一些零碎银行业务知识用Com组织起来,参加了公司的项目(公司用BCB),但是真正自己学到的东西却是不多,真正实现才能说自己学到了。更主要在实现的过程中,必然会遇到许多问题,解决问题,才是学习的最好方法。

已经有Com的一点点思想,真正的Com组件还没做过,动起手来还是挺麻烦。就从现在开始,把整个过程遇到的问题,在这里写出来:

1.从多接口派生对象,在派生列表中加上

 public IDispatchImpl

假设两个接口ITemplCollection,IBankCollection都是从IDispatch派生出来,则需要在COM_MAP中,将COM_INTERFACE_ENTRY(IDispatch) 改成

COM_INTERFACE_ENTRY2(IDispatch/*父接口*/, ITemplCollection/*其中一个子接口*/)

这样做的目的是为了选定当查询IDispatch接口的时候的路径

2.怎么样生成一个不需要实现类的接口比较方便,直接写??那可要自己用GUID工具生成序列号。用VC插入ATL Object,然后删除cpp和h文件,编译出错,暂时还不知道怎么解决。好像是生成的接口,如果一定要从它派生的话,接口函数一定要实现,郁闷。

3.接口模板的问题,想做一个对大部分接口都有用的Collection接口,比如:

有一个IPersonCollection接口,里面的一个函数Add(IPerson *person) 如果做成模板,则所有的接口,什么IPerson,IAnimal都可以放进去
这个Add放到接口里面,自然在idl文件也需要体现出来

似乎需要用到模板类,在对象类中添加模板类还是容易点,可是如果要用一个Add(IXXX *pXXX)IXXX是任意的一个接口,在这个Add函数上面用模板该怎么用呢,主要是idl文件中该怎么写。想到一个方法是Add(IDispatch *pDisp),不过这样每次都要转换成IDispatch就显得比较麻烦了。

后注:找到一个Com模板的例子,看来和类模板还是有很大的区别,研究研究——ATL源代码:templateinterface_src

http://www.vckbase.com/code/listcode.asp?mclsid=17&sclsid=1703&page=7

4.在同一个组件中访问另外一个接口的数据

IA有属性int a,IB中有函数RemoveA(int a),并且有一个vector m_vector是CComVariant的列表,怎么才能正确删除m_vector中有IA:a=a的节点呢?现在关键是有了IA *pA;想取得他的a值,用pA->a出错,说a不是pA得成员,怎么回事。难道还得转成Com对象,具体怎么做呢