怎么样将adoquery中的_recordset当作com接口方法的参数传出,能够当作olevariant传出吗,传出后如何转换为_recordset类型

解决方案 »

  1.   

    a:OleVariant
    adoquery1.recordset := Iunknown(a) as _Recordset;
      

  2.   

    楼上聪明,不过客户端要用的时候呢?还是Recordset方便啊
      

  3.   

    这种方式不好,我不知道传出的接口是否包含了数据,如果这样做很好的话为什么Delphi要提供ClientDataSet?实际上,客户端使用ClientDataSet一样可以做到临时数据表的目的。不明白你为什么要传递这样的一个接口。
      

  4.   

    clientdataset速度只有_recordset的1/3还不到
      

  5.   

    如果你在另外的进程中使用这个传出的接口会怎么样?能够正常使用吗?我怀疑,除了进程内Com传出的接口可以使用,估计进程外com传出的你没有办法用。
      

  6.   

    我试过
    a:OleVariant
    adoquery1.recordset := Iunknown(a) as _Recordset;
    可以在进程外com使用。但没有自定的直接传出的_recordset快,而且狂耗资源。
    我有一个方法定义接口方法如下
    getdata(rs:_recordset...)但没法用类型库编辑器编辑方法,也生成不了tlb.
    delphi开发工具缺陷太多了!!vcl的结构与com的编程思想我觉得很不协调,各位有什么看法吗?
      

  7.   

    嗯?奇怪,接口不通过代理就可以在进程之间传送?不懂了,接口一个指针,封装成OleVariant的时候也只是封装了指针?我是这样理解的。进程内传递使用无所谓,进程外传递是什么过程?可以给我详细解释一下吗?
      

  8.   

    楼上的高手肯定对delphi相当熟悉了,你觉得传指针和传递普通类型(包括class)的数据有什么不一样?
        接口和类的传送你认为有什么分别吗?在c++里接口不就是类,至于他们怎么样实现传到进程外,我也没有看相关的文档。
      

  9.   

    因为进程内存隔离的缘故,同样的指针值在两个进程中意义是不同的。传递普通数据,和传递指针是不同的,指针索引了一个内存,传递普通数据,拷贝了一块内存到另外的进程。传递一个内存索引无意义。接口是类的一个调用标准。接口在无对应的类的实例情况下不能使用,具体的,实例的接口指向了一个方法表,不同实例的同定义接口的行为是不同的。因为对象是存在状态的,所以不能把对象的类当成对象来传送,传递类和传递对象是不同的。两个进程需要共享同一个Com对象,需要代理,实际上,Com对象的宿主仍然在创建他的那个进程当中。或者,你说的传递_RecoredSet只是传递了一个ClassID?在接受进程中重新生成了这个对象?这个不太可能吧?要么ADO提供了代理的方法?他自动地实现了?是怎样的过程?
      

  10.   

    在三层结构中,用SocketConnection连接我是了解的,传递接口指针,Delphi在服务器端和客户端生成了代理。但是不懂的是,这样做有什么好处?不过是在客户端和服务器端多了两个代理而已,有点莫名其妙的。