webbrowser找不到站点 使用webbrowser作为浏览器,如何捕获无法显示相关页面错误??即在ie中显示找不到网页的情况?请指教! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 服务器可能会在找不到网页时重定向到一个错误页面,所以浏览器控件本身无法判断。一个很依赖于网站设置的方法是,捕获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 IE6.0中可以捕获DWebBrowserEvents2::NavigateError事件来获得浏览错误的代码。 webbrowser中可以捕获DWebBrowserEvents2::NavigateError吗?? 有更好的方法防止webbrowser找不到页面吗 【CSDN开心辞典】哪个大版块中小版最多? Delphi开发经验四则 多线程调用web service出现错误提示:尚未调用 CoInitialize 怎样遍历tquery的结果集啊? ActionMainMenuBar的新手问题 又一个关于窗体的简单问题。 请教一些关于Delphi的基础问题 菜鸟求助 请问高手:能不能将运行中的Vxd杀掉? 送分的问题:用数组表示的字符串与纯字符串的不同 有关绘制图线的问题 很怪的错误,根本没发描述,求高人指点,谢谢!(在线,解决就给分!)
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