API/COM/系统相关
Access VBA 判断网络是否连通的多种办法(函数源码)
2013-09-23 23:54:55
VB 利用gethostbyname判断网络是否连接 GetHostbyName API可获取域名对应的IP地址,当没有联网状态将会返回一个错误值。所以可利用它来判断是否联网。

Private Sub Form_Load() If IsConnectedState Then MsgBox "连接网络" Else MsgBox "没有联网" End If End Sub

Option Explicit Private Type WSADATA wversion As Integer wHighVersion As Integer szDescription(0 To 256) As Byte szSystemStatus(0 To 128) As Byte iMaxSockets As Integer iMaxUdpDg As Integer lpszVendorInfo As Long End Type Private Declare Function WSAStartup Lib "WSOCK32.DLL" (ByVal wVersionRequired As Integer, lpWSAData As WSADATA) As Long Private Declare Function WSACleanup Lib "WSOCK32.DLL" () As Long Private Declare Function gethostbyname Lib "WSOCK32.DLL" (ByVal szHostname As String) As Long Private Const WS_VERSION_REQD = &H101 Public Function IsConnectedState() As Boolean Dim udtWSAD As WSADATA Call WSAStartup(WS_VERSION_REQD, udtWSAD) IsConnectedState = CBool(gethostbyname("www.baidu.com")) Call WSACleanup End Function ------------------------------------------------------ 如果程序在联网处理之前能先自动判断用户是否已经联网,就可提高程序运行效率。 

 
Private Sub Form_Load() 
 If IsConnected = TRUE Then 
  MsgBox (“您已经连通了Internet!”) 
 End If 
 If IsConnected = FALSE Then 
  MsgBox (“您还没有连通 Internet!”) 
 End If 
End Sub 
 
  
Option Explicit 
/*有关的API声明和定义*/ 
Public Declare Function RasEnumConnections Lib “RasApi32.dll” Alias “RasEnumConnectionsA” (lpRasCon As Any, lpcb As Long, lpcConnections As Long) As Long 
#p#分页标题#e#  
Public Declare Function RasGetConnectStatus Lib “RasApi32.dll” Alias “RasGetConnectStatusA” (ByVal hRasCon As Long, lpStatus As Any) As Long 
 
  
/*常数和变量的设定*/ 
Public Const RAS95_MaxEntryName = 256 
Public Const RAS95_MaxDeviceType = 16 
Public Const RAS95_MaxDeviceName = 32 
Public Type RASCONN95 
dwSize As Long 
hRasCon As Long 
szEntryName(RAS95_MaxEntryName) As Byte 
szDeviceType(RAS95_MaxDeviceType) As Byte 
szDeviceName(RAS95_MaxDeviceName) As Byte 
End Type 
Public Type RASCONNSTATUS95 
dwSize As Long 
RasConnState As Long 
dwError As Long 
szDeviceType(RAS95_MaxDeviceType) As Byte 
szDeviceName(RAS95_MaxDeviceName) As Byte 
End Type 
  
 
 
 
/*函数IsConnected返回连通的状态,如果为True则表示已连通*/ 
Public Function IsConnected() As Boolean 
 Dim TRasCon(255) As RASCONN95 
 Dim lg As Long 
 Dim lpcon As Long 
 Dim RetVal As Long 
 Dim Tstatus As RASCONNSTATUS95 
 TRasCon(0).dwSize = 412 
 lg = 256 * TRasCon(0).dwSize 
 RetVal = RasEnumConnections(TRasCon(0), lg, lpcon) 
 If RetVal <> 0 Then 
  MsgBox “错误” 
#p#分页标题#e#
  Exit Function 
 End If 
 Tstatus.dwSize = 160 
 RetVal = RasGetConnectStatus(TRasCon(0) 
.hRasCon,Tstatus) 
 If Tstatus.RasConnState = &H2000 Then 
  IsConnected = TRUE 
 Else 
  IsConnected = FALSE 
 End If 
End Function 
----------------------------------------------------
这个函数判断挺好,但在网络不通时连接比较慢
API 函数声明
Public Declare Function InternetCheckConnection Lib "wininet.dll" Alias "InternetCheckConnectionA" (ByVal lpszUrl As String, ByVal dwflags As Long, ByVal dwReserved As Long) As Long
 
Private Sub Form_Load()
 If InternetCheckConnection("http://www.baidu.com/", 1, 0) = 0 Then
     MsgBox "网络不正常"
    Else
        MsgBox "网络正常"
    End If
End Sub
 
 
---------------------------------------
这个函数比较快,但有时判断不准确
 
Private Type WSADATA
    wversion As Integer
    wHighVersion As Integer
    szDescription(0 To 256) As Byte
    szSystemStatus(0 To 128) As Byte
    iMaxSockets As Integer
    iMaxUdpDg As Integer
    lpszVendorInfo As Long
End Type
 
#p#分页标题#e#Private Declare Function WSAStartup Lib "WSOCK32.DLL" (ByVal wVersionRequired As Integer, lpWSAData As WSADATA) As Long
Private Declare Function WSACleanup Lib "WSOCK32.DLL" () As Long
Private Declare Function gethostbyname Lib "WSOCK32.DLL" (ByVal szHostname As String) As Long
Private Const WS_VERSION_REQD = &H101
 
Public Function IsConnectedState() As Boolean
    Dim udtWSAD As WSADATA
    Call WSAStartup(WS_VERSION_REQD, udtWSAD)
    IsConnectedState = CBool(gethostbyname("www.baidu.com"))
    Call WSACleanup
End Function