在调用TWebbrowser控件时,由于需要得连续调用Twebbrowser控件浏览一个网页而产生了内存使用一直增加,直到程序不运行为止,关闭程序后内存又立即被释放,回到正常使用量状态。这是什么原因,有什么方法可以解决这个内存问题。

解决方案 »

  1.   

    贴你调用Twebbrowser的源码出来看看?
      

  2.   

    IHTMLDocument2没有释放?你再次访问前先让它去访问下about:blank看看。
      

  3.   

    不是啊。
    下面是其中一段代码
    repeat
        downcompelete:=false;
        wb.navgate(url,flags,flags,flags,flags);
        repeat
            application.pressmessage;
        until downcompelete;
        doc:=wb.document as ihtmldocument2;
        str:=doc.body.outtext;
        p:=pos('特征串',str);
    until p<>0;
    这段代码是说,浏览网页是否是正确的网页。这样下去之后内存就一直上涨没有下降过。直到内存使用率100%。(说明:这段代码能走出循环,走出循环后内存也是上涨)。
      

  4.   

    把str每次使用前初始化一下看看。
      

  5.   

    downcompelete:=false;
    wb.navgate(url,flags,flags,flags,flags);
    repeat
      application.pressmessage;
    until downcompelete;downcompelete???不是死循环吗?
      

  6.   

    应该跟那个repeat循环无关.这儿大不了加上一个超时跳出循环的条件.暂关注.
      

  7.   

    用CoFreeUnusedLibraries()试试,这个函数回收垃圾COM对象。
      

  8.   

    先试一下楼上的方法看行不行,这段时间一直被这个问题困扰。
    另上面代码中:downcompelete 是在Twebbrowser控件的oncompelet(页面是否下载完成)事件改变它的值的.如果网页页面存在,上面的是一个两重循环,意思是这个页面真正打开为止。
      

  9.   

    每个frame结束都有这个事件发生的,一个页面多个frame很正常。需要判断是那个完成。
      

  10.   

    楼主,你是访问特定网页出这样问题还是访问任何网页都会这样???因为WEBBROWSER 打开网页过程中 涉及相关的大大小小组件太多..很可能是调用到的
    其中某少数COM问题造成的内存泄漏..
      

  11.   

    procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant);
    begin
      if (pDisp = CurDispatch) then
      begin
        Beep; {the document is loaded, not just a frame }
        CurDispatch := nil; {clear the global variable }
      end;
    end;
      

  12.   

    无法编译,我在delphi下
    问题出在pDisp = CurDispatch,怎么回事?
      

  13.   

    CurDispatch是一个全局变量,要在interface部分定义它
    var  CurDispatch: IDispatch; {save the interface globally }可能不是这个问题,我再看看
      

  14.   

    感觉WebBrowser无法完全释放它用过的内存,像你这么用肯定会把内存用光为止。
    其实,即使是IE也无法完全释放它使用的内存。不信你就用IE访问几十个不同的网站试试。
    而WebBrowser其实就是IE啊。这是微软的问题。其实你只是通过特征码判断打开的网页是否正确,根本不需要使用WB,用InternetReadFile函数吧!
      

  15.   

    给你一个得到网页源码的函数:
    function GetWebPageText( sUrl: string ):string;
    var
      hInternet: pointer ; // Handle of Internet Session (InternetOpen)
      hOpenUrl: pointer ; // Handle of Internet Open URL (InternetOpenURL)
      bLoop: boolean ;
      lpBuffer: Array[0..2048] of Char ;
      lpdwNumberOfBytesRead: DWORD ;
      sBuffer: string ;
    begin
      // Obtaining a handle to an internet session.
      //
      // INTERNET_OPEN_TYPE_PRECONFIG = 0;
      // {将Internet Option中的预设Proxy 服务器设定为主服务器}
      //
      // INTERNET_FLAG_NO_CACHE_WRITE = $04000000;
      // {不将Internet连接的资料写入Cache中}  hInternet := InternetOpen(pchar('Application'),
                          INTERNET_OPEN_TYPE_PRECONFIG,
                          nil,
                          nil,
                          INTERNET_FLAG_NO_CACHE_WRITE) ;  // If internet session created OK
      if (hInternet <> nil) then
      begin
        // InternetOpenURL
        // Begin reading a complete HTTP URL.
        hOpenUrl := InternetOpenUrl(hInternet,
                        pChar(sUrl),
                        nil,
                        0,
                        INTERNET_FLAG_RELOAD,
                        $0) ;    // If Open URL OK
        If (hOpenUrl <> nil) Then
        begin
          bLoop := True;
          sBuffer := '';      while bLoop do
          begin
            lpBuffer := '' ;
            // InternetReadFile
            // Reads data from a handle opened by the InternetOpenUrl
            InternetReadFile(hOpenUrl, @lpBuffer, sizeof(lpBuffer), lpdwNumberOfBytesRead) ;        If lpdwNumberOfBytesRead = 0 Then
               bLoop := False
            else
               sBuffer := sBuffer + strPas(lpBuffer) ;
          end;      result := sBuffer;
        end
        else
          result := '';
      end  // for "If Open URL OK "
      else
      begin
        result := '';
      end ;  // close Open URL
      if (hOpenUrl <> nil) then InternetCloseHandle(hOpenUrl) ;
      // close internet session
      if (hInternet <> nil) then InternetCloseHandle(hInternet) ;
    end;使用方法:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      s : string;
    begin
      s := GetWebPageText( 'http://www.icondiy.com' );//注意,要填写完整的url
      if s <> '' then
         Memo1.Lines.Add( s );
    end;
      

  16.   

    我研究了2天终于知道了,其实用线程来写就可以了,调用完释放线程,webbrowser所用的内存和数据全部释放了~
    就可以继续执行了。
      

  17.   

    调用线程我也试过.还是先谢谢:flyinwuhan(制怒·三思而后行) ,我之所以用Webbrower是因为要用它来模拟提交网页,而得到后面网页的数据。但就是因为内存的问题就不能运行太久。一旦开启来只能运行1个多小时左右。
      

  18.   

    http://expert.csdn.net/Expert/topic/2979/2979649.xml?temp=.1756098
    大侠帮忙看看我的问题 解决立即给分
      

  19.   

    这个是IE 5的问题,调用Refresh就可以释放内存。
    IE 6已经修正了这个bug。
      

  20.   

    liukangcoco(liukang) 、hhzxf(因为有你) 有否例程贴出来大家欣赏?