我在客户端的代码如下,调用WEB SERVICE一端的时候,WEB SERVICE返回一个数值
  CoInitialize(nil);
  try
    HTTPRIO1.URL := 'http://localhost/scripts/package.dll/soap';
    packobj := HTTPRIO1 as Ipackage;
    packobj.packdata(par1);
  finally
    CoUninitialize;
    packobj := nil;
 end;
这段代码我放在了一个客户端的一个定时器下让它500毫秒访问一次WEB SERVICE端,但是这样内存的使用会不断增长

解决方案 »

  1.   

    首先确定一下你是客户端程序发生的MEMLEAK还是服务端发生的?
      

  2.   

    定时器不是线程,一般来说,不用CoInitialize/CoUninitialize
    这句也可以放到FORM 的ONCREATE或ONSHOW里去
        HTTPRIO1.URL := 'http://localhost/scripts/package.dll/soap';
    把PACKOBJ放到FORM中作为一个成员,这样下面这句也可以在FORM ONCREATE等里执行一次即可
        packobj := HTTPRIO1 as Ipackage;
    这样在定时器中只要执行这一句即可,这样再试试看还有没有
        packobj.packdata(par1);
      

  3.   

    但是packobj放不到FORM类中啊,我在按钮下是这样声明的:var scanobj: Iscanws;
    Iscanws为WEB SERVICE的接口,但是我在把它添加到FORM成员时会出现错误:Undeclared identifier: 'Iscanws'。找不到'Iscanws'此接口,这该怎么办呢?
      

  4.   

    把implementation里的uses里的接口单元放到inerface里的uses中去就不会有这个错了
      

  5.   

    你肯定是在implement下面use接口单元了。请教一下Raptor,为什么线程要用CoInitialize/CoUninitialize?
      

  6.   

    谢谢楼上的朋友,因为CoInitialize/CoUninitialize是对COM的初始化和反初始化吧
      

  7.   

    gengxuyong兄,刚才我让你吓了一跳,我有一个程序也是循环调用一个webservice,我看了你的贴,测了一下,发现从8m一路涨,吓死了,后来发现到25m左右又会减少到10m,如此往复。真是好险
      

  8.   

    可是我的程序就不行了啊,我在晚上下班的时候把程序打开开始运行然后第二天一看,内存溢出,应用程序终止。不知楼上的朋友是如何调用WEB SERVICE端的呢?
      

  9.   

    我调用的方法和你一样的,只不过我是指定到接口
    HTTPRIO1.URL := 'http://localhost/scripts/package.dll/soap/IMyService';
      

  10.   

    这个一般是因为服务端出错,返回了HTML页面所致,因为SOAP只认XML,碰到HTML就出这个错
      

  11.   

    刚才我也把HTTPRIO1.URL指定到了接口,试了一段时间但是,内存还是在不断的增长。
    另外总是很频繁的出现,“文档的顶层无效“的错误。怎么办呢?客户端完整代码:
    var
      scanobj: Iscanws;
      cc: integer;
    begin
      CoInitialize(nil);
      try
        HTTPRIO1.URL := 'http://localhost/scripts/scanwebservice.dll/soap';
        scanobj := HTTPRIO1 as Iscanws;
        cc := scanobj.scan(2);
        ListBox1.Items.Clear;
        ListBox1.Items.Add(inttostr(cc));
      finally
        CoUninitialize;
        scanobj := nil;
     end;服务端的完整代码:
    function Tscanws.scan(port: integer): integer;
    begin
      result := port;
    end;
    此函数为服务端的接口函数
    另外上述的客户端代码是放在了一个定时器下边的,HTTPRIO1也是静态的放到FORM上的控件请各位帮忙找一下问题!