这是一段检测网络连通性的代码,但是在检测时候,可能会出现连接时间过长的问题。也就是有可能10秒钟过去了,也没完成检测呢。
请高手帮忙完善一下,让他只在5秒内检测,如果5秒内没有检测结果,那么自动中断检测,让CheckConnection = False。
Private Declare Function InternetOpenUrl Lib "wininet.dll" Alias "InternetOpenUrlA" (ByVal hInet As Long, ByVal lpszUrl As String, ByVal lpszHeaders As String, ByVal dwHeadersLength As Long, ByVal dwFlags As Long, ByVal dwContext As Long) As Long
Private Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (ByVal lpszAgent As String, ByVal dwAccessType As Long, ByVal lpszProxyName As String, ByVal lpszProxyBypass As String, ByVal dwFlags As Long) As Long
Private Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInet As Long) As Long
  
Public Function CheckConnection(Optional URL As Variant) As Boolean
Dim hInet     As Long
Dim hUrl     As Long
Dim flags     As Long
Dim pingURL
    If IsMissing(URL) Then
        pingURL = "http://www.baidu.com"
    Else
        pingURL = URL
    End If
Dim INTERNET_OPEN_TYPE_PRECONFIG, INTERNET_FLAG_KEEP_CONNECTION, INTERNET_FLAG_NO_CACHE_WRITE
Dim INTERNET_FLAG_RELOAD
    hInet = InternetOpen(App.Title, INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0&)
    If hInet Then
        flags = INTERNET_FLAG_KEEP_CONNECTION Or INTERNET_FLAG_NO_CACHE_WRITE Or INTERNET_FLAG_RELOAD
        hUrl = InternetOpenUrl(hInet, pingURL, vbNullString, 0, flags, 0)
        If hUrl Then
            CheckConnection = True
        Else
            CheckConnection = False
        End If
    End If
    Call InternetCloseHandle(hInet)
End Function

解决方案 »

  1.   

    使用InternetOpenFile代替InternetOpenUrl。
      

  2.   

    在开启检测的同时启动一个timer,时间设为5000ms,在timer时间中终止检测啊!
      

  3.   

    这个只是一个理论,但是你要怎么通过一个timer来中断另一个Function呢?而且,在模块中,你又如何使用timer呢?
      

  4.   

    不好意思,俺说错了,InternetOpenUrl就是打开URL资源,不存在InternetOpenFile,楼主可以使用异步方式加Timer(如果不用Timer则需要多线程),根据InternetOpenUrl的执行进度设置一个变量,然后在Timer里判断,如果超时则强行关闭InternetOpen打开的句柄(由于这时InternetOpenUrl尚未完成,因此没有产生句柄)。至于异步winnet API,网上有许多例子,不过大都是C语言的。
      

  5.   

    这个方法好像不大可行。因为hUrl = InternetOpenUrl的时候,如果InternetOpenUrl没有完成,那么hUrl取不到值,就不会进行下面的语句,所以在InternetOpenUrl过程中,无法用变量来中断。所以貌似只能等待
      

  6.   

    我说了,是异步,这样InternetOpenUrl就不会出现阻塞,但返回的hUrl有可能非法。