下面就是那时写的一个类TZoCInetChecker,提供了一个Method,几个Properties,还有几个Events,用起来和上面那个阻塞调用的函数一样方便,当然,它也包含了阻塞方式的检测:
方法
Execute: 调用我就好了,其它的交给我去办
属性
Busy: 我正忙着呢,还没检测完,一会儿再来
AccessType: 你希望我怎么连接网络,直接连还是用代理?
AsynRequest: 同步检测的话我们要有一会儿看不到对方了,呜呜
UserAgent: 想告诉Web服务器是阿猫还是阿狗在连接?在这里设置就好了
Proxy: 让我用代理连网络,用哪个代理啊?
Url: 原来是要检测这个地址能不能访问,保证办到
事件
OnStart: 开始检测之前我会在这里通知你一声
OnStatusChange:检测过程中发生什么事我会在这里及时通知你的
OnComplete: 检测完成了,成功不成功我都会告诉你
{**********************************************************}
{ }
{ TZoCInetChecker Component Version 1.00 }
{ }
{ Function: Asynchronously Check if a given web page }
{ can be successfully retreived and feed back }
{ the user with callback status infomation }
{ }
{ }
{ This is a freeware. If you made cool changes on it, }
{ please send them to me. }
{ }
{ Email: eagleboost@msn.com }
{ URL: http://www.ZoCsoft.com }
{ }
{ History: + New Feature, - Removed, * Modified }
{ }
{ version 1.00 2005-06-03 }
{ The first version }
{ }
{**********************************************************}
unit ZoCInetChecker;
interface
uses
Windows, Messages, SysUtils, Classes, WinInet;
const
INTERNET_STATUS_DETECTING_PROXY = 80;
{$EXTERNALSYM INTERNET_STATUS_DETECTING_PROXY}
WM_STATUSCHANGE = WM_USER + 200;
WM_CHECKCOMPLETE = WM_USER + 201;
type
LPINTERNET_ASYNC_RESULT = ^INTERNET_ASYNC_RESULT;
INTERNET_ASYNC_RESULT = record
dwResult: DWORD;
dwError: DWORD;
end;
pREQUEST_CONTEXT = ^REQUEST_CONTEXT;
REQUEST_CONTEXT = record
hWindow: HWND;
hOpen: HINTERNET; //HINTERNET handle created by InternetOpen
end;
TOnStatusChangeEvent = procedure(Sender: TObject; StatusCode: Cardinal) of object;
TOnCompleteEvent = procedure(Sender: TObject; Connected: Boolean) of object;
TAccessType = (atDirectConnect, atPreConfig, atPreConfigWithNoProxy, atProxy);
TZoCInetChecker = class(TComponent)
private
{ Private declarations }
FUrl: string;
FAccessType: TAccessType;
FProxy: string;
FOnStart: TNotifyEvent;
FOnStatusChange: TOnStatusChangeEvent;
FOnComplete: TOnCompleteEvent;
FBusy: Boolean;
hOpenUrl, hOpen: HINTERNET;
FUserAgent: string;
FWindowHandle: HWnd;
iscCallback: INTERNET_STATUS_CALLBACK;
RC: REQUEST_CONTEXT;
FAsynRequest: Boolean;
procedure WndProc(var Msg: TMessage);
protected
{ Protected declarations }
procedure DoOnStatusChange(StatusCode: Cardinal); dynamic;
public
{ Public declarations }
property Busy: Boolean read FBusy write FBusy;
function Execute: Boolean;
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
{ Published declarations }
property AccessType: TAccessType read FAccessType write FAccessType
default atDirectConnect;
property AsynRequest: Boolean read FAsynRequest write FAsynRequest
default True;
property UserAgent: string read FUserAgent write FUserAgent;
property Proxy: string read FProxy write FProxy;
property Url: string read FUrl write FUrl;
property OnStart: TNotifyEvent read FOnStart write FOnStart;
property OnStatusChange: TOnStatusChangeEvent read FOnStatusChange write
FOnStatusChange;
property OnComplete: TOnCompleteEvent read FOnComplete write FOnComplete;
end;
procedure Register;
function StatusCode2StatusText(StatusCode: Cardinal): string;
implementation
procedure Register;
begin
RegisterComponents('ZoC', [TZoCInetChecker]);
end;
相关专题
- VB.NET 入门教程 (22167次浏览)
- VB.NET读写文本文件方法 (579次浏览)
- vb.net入门——MDI 窗体的基础使用 (342次浏览)
- 浅析Visual Basic.NET中的资源使用 (322次浏览)
- vb.net入门——Windows 窗体中的提示对话框 (296次浏览)
- vb.net入门——PictureBox控件的使用 (268次浏览)
- vb.net入门——ToolBar 控件的使用 (267次浏览)
- vb.net入门——DateTimePicker 控件的使用 (260次浏览)
- vb.net入门——Splitter 控件的使用 (254次浏览)
- vb.net入门——Windows窗体中的菜单操作 (243次浏览)



