使用webbrowser作为浏览器,如何捕获无法显示相关页面错误??
即在ie中显示找不到网页的情况?请指教!

解决方案 »

  1.   

    服务器可能会在找不到网页时重定向到一个错误页面,所以浏览器控件本身无法判断。一个很依赖于网站设置的方法是,捕获TitleChange事件,在页面标题包含"找不到页面"或者"Page Not Found"之类的字符串时,认为浏览失败。另一个方法是处理BeforeNavigate2事件,用winhttp api单独和服务器连接,使用HttpQueryInfo来查询,相应参数是HTTP_QUERY_STATUS_CODE。在这之前,你可能要在打开URL时用INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP | INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS标志来防止服务器的重定向。
    Uses:Wininet;procedure WBBeforeNavigate2(Sender: TObject;
      const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
      Headers: OleVariant; var Cancel: WordBool);
    var
      sAppName: string;
      hSession, hURL: HInternet;
      pBuffer: DWORD;
      BufferLength, Index: DWORD;
      Status: integer;
    begin
      sAppName := ExtractFileName(Application.ExeName);
      Status := 0;
      hSession := InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
      if hSession <> nil then
      try
        hURL := InternetOpenURL(hSession, PChar(VarToStr(URL)), nil, 0, INTERNET_FLAG_NO_CACHE_WRITE + INTERNET_FLAG_RELOAD, 0);
        Index := 0;
        BufferLength := 20;
        if HttpQueryInfo(hURL, HTTP_QUERY_STATUS_CODE + HTTP_QUERY_FLAG_NUMBER, @pBuffer, BufferLength, Index) then
          Status := pBuffer;
        try
          if Status <> 200 then
          begin
            Cancel := True;
            ShowMessage('HTTP Status Code Is: ' + IntToStr(Status));
          end;
        finally
          InternetCloseHandle(hURL);
        end;
      finally
        InternetCloseHandle(hSession);
      end;
    end;这种方法会造成每个页面备下载两次,一次由浏览器控件发起,一次由网址测试代码发起。InternetGetLastResponseInfo在找不到网页(404)时不会返回错误。参考http://www.microsoft.com/mind/0796/protocol/protocol.asp
      

  2.   

    IE6.0中可以捕获DWebBrowserEvents2::NavigateError事件来获得浏览错误的代码。
      

  3.   

    webbrowser中可以捕获DWebBrowserEvents2::NavigateError吗??
      

  4.   

    有更好的方法防止webbrowser找不到页面吗