IMemoApp = interface;
  IMemoAppDisp = dispinterface;//dispinterface和interface有什么不同,我
                              //试着换了换, 用控制器调用时效果一样啊?why?做多层的时候就不同了,不信你用TSocketConnection连接,再这样转换:
 
var
  IMemo: IMemoApp;
  IMemoDisp: IMemoAppDisp;
begin
  IMemo := IMemoApp(IDispatch(SocketConnection1.AppServer));
  IMemo.MyMethod;// 错误  IMemoDisp := IMemoAppDisp(IDispatch(SocketConnection1.AppServer));
  IMemoDisp.MyMethod; //正确
end;

解决方案 »

  1.   

    a: interface
    b: dispinterface
    我的理解是:
        1 通常b用来定义Automation对象,a适用面更广,但
            一般不用在COM对象上,copy_paste讲的是这种情况
        2 a是从接口祖先IUnknown继承下来的,用户自定义接口时用得较多,
            而b一般产生于定义COM时的自动生成代码中
    另外,a的定义中可以有过程或函数,但不能定义属性,而b可以包含Fields。
     
      

  2.   

      IMemoApp = interface;
      IMemoAppDisp = dispinterface;//dispinterface和interface有什么不同,我
                                  //试着换了换, 用控制器调用时效果一样啊?why?
    ========================
    interface 实现自定义接口(??我猜的)
    dispinterface 实现IDispatch接口
    旺财 讲的有道理
      

  3.   

    当然了,interface就是虚表的接口,dispinterface就是定义dispatch接口1
      

  4.   

    interface支持的是early-binding,实现Idispatch的接口支持late-binding,dispinterface是一个折中的办法,要说区别,调用上没有大的区别,但是有个效率问题,使用interface效率最高,dispinterface次之,late-binding最好用也是效率最差的,原因是
    late-binding也要调用getid...()然后才调用invoke(),而dispinterface运行时不调用getid..(),interface在编译时要知道服务器的tlb,编译时就检查语法