tempad
Readygo技术搜索引擎 >>防火墙 >> 高份请教:在DELPHI中如何判断电脑是否联上了INTERNET,是否断线啦.

高份请教:在DELPHI中如何判断电脑是否联上了INTERNET,是否断线啦.

Readygo技术搜索引擎 网络搜索 efish 2008-1-17 18:20:26

高份请教:在DELPHI中如何判断电脑是否联上了INTERNET,是否断线啦.

楼主kxsoft(开心)2002-09-14 09:41:08 在 Delphi / VCL组件开发及应用 提问

请问如何实时检测系统是否联上了internet,    
   
  问题点数:100、回复次数:6Top

1 楼z_hongbao()回复于 2002-09-14 09:57:02 得分 90

 
  检测计算机是否联网比较简单的做法可以通过一个   Win32   Internet(WinInet)   函数   InternetCheckConnection来实现;  
   
  这个函数的功能是检查是否能够建立   Internet   连接。  
   
  它的实现是在   %SystemRoot%\System32\wininet.dll   中,Delphi   调用声明在   WinInet.pas   中,  
   
  其   API   声明如下:  
   
  BOOL   InternetCheckConnection(  
   
      IN   LPCSTR   lpszUrl,  
   
      IN   DWORD   dwFlags,  
   
      IN   DWORD   dwReserved  
   
  );  
   
  参数的意义是:  
   
  lpszUrl:   需要测试能否建立连接的   URL   地址,可以为空;  
   
  dwFlags:   目前只能是   FLAG_ICC_FORCE_CONNECTION(这个常量   Delphi   中没有声明,其值为   $00000001);  
   
  dwReserved:   目前只能为   0。  
   
  调用的说明:  
   
  如果   lpszUrl   是非空的,Windows   从中解析出   Host   名然后   Ping   这个指定的   Host。  
   
  如果   lpszUrl   是空的,并且   WinInet   内部服务器的   database   中有一个关于最近的   Server   的纪录,Windows   就从这条纪录中解析出   Host   名然后   Ping   它。  
   
  如果能够成功的连接返回   True,否则返回   False;  
   
  以下是一个判断当前计算机是否联网的例子:  
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
   
  begin  
   
      if   InternetCheckConnection("http://www.yahoo.com/",   1,   0)   then  
   
      edit1.text:=   "Connected"  
   
      else  
   
      edit1.text:=   "Disconnected";  
   
  end;  
   
  通过上述的方法只能检测出当前计算机是否物理联网,即网线是否接好,网卡是否能顺利工作,不能确定是否能够实现获得   Internet   服务,即是否能和   ISP   进行   Internet   连接。  
   
  这时可以通过另一个   Win32   Internet(WinInet)   函数   InternetQueryOption   来检测;  
   
  这个函数的功能是查询指定   Internet   句柄的状态、选项。  
   
  其   API   声明如下:  
   
  BOOL   InternetQueryOption(  
   
      IN   HINTERNET   hInternet,  
   
      IN   DWORD   dwOption,  
   
      OUT   LPVOID   lpBuffer,  
   
      IN   OUT   LPDWORD   lpdwBufferLength  
   
  );  
   
  参数的意义是:  
   
  hInternet:查询对象的   Internet   句柄(全局查询时为   nil),  
   
  dwOption:查询的项目;  
   
  lpBuffer:返回的查询结果;  
   
  lpdwBufferLength:查询结果的字节长度(包括   IN   和   OUT);  
   
  查询成功返回   True,否则返回   False;  
   
  我们要查询当前计算机的   Internet   连接状态时可以使用查询项目   INTERNET_OPTION_CONNECTED_STATE,  
   
  得到的   ConnectState   返回值可能是以下值的一个或几个值之和:  
   
  INTERNET_STATE_CONNECTED   :$00000001   连接状态;  
   
  INTERNET_STATE_DISCONNECTED   :$00000002   非连接状态(和   INTERNET_STATE_CONNECTED   对应);  
   
  INTERNET_STATE_DISCONNECTED_BY_USER   :$00000010   用户请求的非连接状态  
   
  INTERNET_STATE_IDLE   :$00000100   连接状态,并且空闲  
   
  INTERNET_STATE_BUSY   :$00000200   连接状态,正在响应连接请求  
   
  以下是一个判断当前计算机是否可以获得   Internet   服务的例子:  
   
  function   TForm1.CheckOffline:   boolean;  
   
  var  
   
      ConnectState:   DWORD;  
   
      StateSize:   DWORD;  
   
  begin  
   
      ConnectState:=   0;  
   
      StateSize:=   SizeOf(ConnectState);  
   
      result:=   false;  
   
      if   InternetQueryOption(nil,   INTERNET_OPTION_CONNECTED_STATE,   @ConnectState,   StateSize)   then  
   
      if   (ConnectState   and   INTERNET_STATE_DISCONNECTED)   <>   2   then   result:=   true;  
   
  end;  
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
   
  begin  
   
      if   CheckOffline   then  
   
      edit1.text:=   "Connect   To   ISP"  
   
      else  
   
      edit1.text:=   "Disconnect   To   ISP";  
   
  end;  
   
  需要说明的是   InternetQueryOption   函数的检测结果只能表明当前的   Internet   设置是可用的,  
   
  并不能表示计算机一定能访问   Internet,例如网线掉了,网卡突然坏了之类的错误就没法检测出来,  
   
  要想检测当前计算机是否能够获得   Internet   服务了必须两个函数结合起来使用。  
   
  以上程序在   Win2000,   Delphi5.0   下调试通过。  
   
  最后要提醒大家注意的是在   uses   中要加上   WinInet。  
   
  对于   Windows   2000   中网络掉线的实时检测,猜想是和底层的中断或者某个   Service   有关,  
   
   
  Top

2 楼dreamfan(改行不做程序员,回家种地。)回复于 2002-09-14 10:02:00 得分 0

我先试试Top

3 楼AV_15(C.C.Q.)回复于 2002-09-14 10:26:23 得分 10

试试这个:  
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
  begin  
      if   GetSystemMetrics(SM_NETWORK)   AND   $01   =   $01   then  
          ShowMessage("Machine   is   attached   to   network")   else  
          ShowMessage("Machine   is   not   attached   to   network");  
  end;Top

4 楼AV_15(C.C.Q.)回复于 2002-09-14 10:36:55 得分 0

好像通过读取注册表的某个键也可以判断网络状态,可惜我想不起来了!Top

5 楼search_you(一人)回复于 2002-09-14 10:54:54 得分 0

看看这个:  
  http://www.csdn.net/expert/topic/986/986842.xml?temp=.4735224Top

6 楼kerplayer(含玉)回复于 2002-09-14 10:56:27 得分 0

gzTop

责任编辑: efish 参与评论 查找更多:
相关文章
用钩子实现进程防杀 用钩子实现进程防杀
如何恢复已经删除的文件,急 如何恢复已经删除的文件,急
请教两个问题,专家请进! 请教两个问题,专家请进!
谁会写文件上传的代码 谁会写文件上传的代码
一份让我们良心不安的调查-----良心不安并不可怕,可… 一份让我们良心不安的调查-----良心不安并不可怕,可怕的是不安过后一切照旧
我做了一个收发e-mail的软件,怎样选择存放附件的路… 我做了一个收发e-mail的软件,怎样选择存放附件的路径?
WEBLOGIC下的WEB应用文件的放置问题 WEBLOGIC下的WEB应用文件的放置问题
我要做一个关于基于板卡的呼叫中心的服务器端的开发… 我要做一个关于基于板卡的呼叫中心的服务器端的开发,应该是多线程的,我应该看什么资料呢?
怎样通过程序就能够知道指定的ip地址能否ping通 怎样通过程序就能够知道指定的ip地址能否ping通
我的xp经常死机 我的xp经常死机
2秒记住本站域名

玩过泡泡龙吗?Readygo?Go! 再加上.Com.Cn的后缀,那就是大名小顶的readygo.com.cn

分类导航
Readygo技术搜索引擎