以前做三层是用c++ builder ,现在想试试用delphi
我在应用服务器端定义了一个方法Method1
如下:
procedure Tmyrmdatasv.Method1;
beginend;我让它什么也不做,只是为了测试怎么从客户端掉用。客户端掉用的代码如下:procedure Tfmmytest.Button2Click(Sender: TObject);
var
apps:Imyrmdatasv;
begintry
apps := Imyrmdatasv( IDispatch( dm.socktconnect.AppServer ) );
apps.method1();  //////////////////////运行出错的光标停止在这行
except
on e:exception do
showmessage(e.Message);
end;
end;编译可以通过,运行时一点调用的那个button就出错:
access violation at address IED20049.read of address IED20049看样子好像是读写内存的错误,但是不知道为什么出这个错误,请各位高手帮帮忙看看。

解决方案 »

  1.   

    内存错误,我遇到过好多次,不知道为什么会出现这问题,我的解决方法是把出错的代码重写一遍就好了不过,我在调用中间层过程时出现了这样一个问题,知道的请帮一下忙:
    Method 'UserVerify' not supported by automation object
      

  2.   

    最好在函数后面加上Stdcall; (接口类型)我用dcomconnection 是这样的
    dm.dcomconnection .AppServer.method();
    我想socketconnection 也是一样的
      

  3.   

    我刚才根据您的提示,到程序里看了,程序自动给method加了safecall 关键字,
    如果我改成stdcall就出错。
      

  4.   

    调用代码一:
     dm.socktconnect.AppServer.method1();
    调用代码二:
    var
    apps:Imyrmdatasv;
    beginapps := Imyrmdatasv( IDispatch( dm.socktconnect.AppServer ) );
    apps.method1();两种写法有什么区别吗?
    我写第一种方法时,appserver后面按“点“后不会 自动出来method1,
    而第二种写法apps按“点“后会 出来method1
      

  5.   

    调用代码一:
     dm.socktconnect.AppServer.method1();
    调用代码二:
    var
    apps:Imyrmdatasv;
    beginapps := Imyrmdatasv( IDispatch( dm.socktconnect.AppServer ) );
    apps.method1();两种写法有什么区别吗?
    我写第一种方法时,appserver后面按“点“后不会 自动出来method1,
    而第二种写法apps按“点“后会 出来method1
    第一种写法是Last binding 方式,代码在编译期不会去检验是否错误,也没有IntelliSense功能(就是按点后自动弹出文字。)这种方式调用速度会稍微慢一些。
    第二种写法是使用 dispatch interfaces,使用这种方法速度略快于第一种方式,但是用这种方式你必须在客户端引用服务器端的XXX_TLB unit 
      

  6.   

    我用第一种方法可以了,用第二种方法就出现本贴的错误了。我在客户端已经引用应用服务器端的
    myrmsv_TLB.pas文件了。 不直到怎么会提示如本贴中的错误。