📄 02.htm
字号:
<p>CWinInetConnection---一个封装了WinInet API函数的类 </p>
<p></p>
<p></p>
<p></p>
<p>部分WinInet API函数允许你建立或断开Internet连接,定义当前Internet连接及其属性。WinInet负责控制系统 在线和离线两种状态。当系统处于离线状态时,IE会从Cache中读取所需的资料,如果是在线状态,则 IE会从Internet上读取资料。</p>
<p></p>
<p>注意 </p>
<p>当处于在线状态时,IE仍会首先在Cache中寻找你输入的URL是否存在。如果是,IE会检查其真实性。IE会将在Cache</p>
<p>中资料的日期同服务器上的资料的日期相比较。如果Cache中的资料是旧的话,则从服务器上读取资料。 </p>
<p></p>
<p>CwinInetConnection实现了上述功能。它封装了WinInet API函数,并使你能在下一个方法或属性中创建类的实例。</p>
<p></p>
<p>方法 描述 </p>
<p> SetGlobalOnline 将系统转换到在线状态 </p>
<p>SetGlobalOffline 将系统转换到离线状态 </p>
<p>GoOnline 出现对话框,询问是否需要将系统转到在线状态以获取所需的资料。 </p>
<p>AutoDial 出现建立默认连接对话框 </p>
<p>Dial 出现建立用户自定义连接对话框 </p>
<p>AutoDialHangUp 在使用AutoDial方法后中断当前连接 </p>
<p>HangUp 使用Dial方法后中断当前连接 </p>
<p>Refresh 刷新类的属性 </p>
<p>表一、 CWinInetConnection类所包含的方法 </p>
<p></p>
<p></p>
<p> </p>
<p></p>
<p>如你所见,上半部分用来显示类的属性。所有属性,除ConnectionName外,都是布尔类型。并且这些属性是只读的。</p>
<p></p>
<p>属性 描述 </p>
<p>IsConnected 若返回值为真,表明Internet连接已建立 </p>
<p>ConnectionName 返回当前活动连接的名称 </p>
<p>IsConnectionConfigured 若返回值为真,表明系统的Internet连接设置正确 </p>
<p>IsOffline 若返回值为真,表明系统目前处于离线状态 </p>
<p>IsRasInstalled 若返回值为真,表明系统已装了远程访问服务(RAS) </p>
<p>UseProxy 若返回值为真,表明系统是通过代理服务器连上Internet </p>
<p>UseLAN 若返回值为真,表明系统通过局域网连上Internet </p>
<p>UseModem 若返回值为真,表明系统通过Modem拨号上网 </p>
<p>表二、 CWinInetConnection的属性 </p>
<p></p>
<p>如果你想看看CWinInetConnection类是如何工作的,又或者想不用CWinInetConnection类,自己调用WinInet API函数</p>
<p></p>
<p></p>
<p></p>
<p></p>
<p>--------------------------------------------------------------------------------</p>
<p></p>
<p>在VB中用WinInet API函数并没有什么特别。你需要用到下面的几个函数。</p>
<p></p>
<p>InternetAutodial </p>
<p>InternetAutodialHangup </p>
<p>InternetDial </p>
<p>InternetHangUp </p>
<p>InternetGoOnline </p>
<p>看看类的源代码,就知道上面几个函数的用法。所以这里就不再多说。比较难的一个部分是如何判断系统是在线还是离线?这需要用到InternetGetConncedStateEx函数。该函数不仅可以判断是否已经建立了Internet连接,还能返回一大堆连接的属性。</p>
<p></p>
<p>在试着调用InternetGetConnectedStateEx函数,遇到了不小的麻烦。该函数的行为更象是一个C语言函数。下面是该函数的声明:</p>
<p></p>
<p>Declare Function InternetGetConnectedStateEx Lib "wininet.dll" Alias "InternetGetConnectedStateExA" (lpdwFlags As Long, lpszConnectionName As Long, dwNameLen As Long, ByVal dwReserved As Long) As Long</p>
<p></p>
<p>如果系统已经连上了Internet,该函数就会返回一个非零的值。最后一个参数dwReserved,被留作以后扩展之用,在这里它必须等于零。参数lpszConnectionName返回一个字符串,即当前连接的名称。参数dwNameLen包含该字符串的大小。最后一个参数lpdwFlags返回一个类型为Long的值,其中包含一系列的属性。下面是Refresh方法的部分代码,其主要目的是要调用InternetGetConnectedStateEx函数。</p>
<p></p>
<p>'Allocate buffer for the name of connection </p>
<p>strConnectionName = Space(256) </p>
<p>'Initialize variable lNameLen - the length of the buffer </p>
<p>lNameLen = 256 </p>
<p>'Get the pointers to the variables we're going to pass </p>
<p>'to the function InternetGetConnectedStateEx </p>
<p>lPtr = StrPtr(strConnectionName) </p>
<p>lNameLenPtr = VarPtr(lNameLen) </p>
<p>'Call the InternetGetConnectedStateEx function. </p>
<p>'Please pay attention that two parameters are </p>
<p>'passing pass by the value (ByVal) </p>
<p>lRetVal = InternetGetConnectedStateEx(lConnectionFlags, _ </p>
<p> ByVal lPtr, ByVal lNameLen, 0&)</p>
<p> </p>
<p>'The processing of the lRetVal is missed </p>
<p></p>
<p>'Check the appropriate bits of the lConnectionFlags </p>
<p>'in order to initialize the properties of CWinInetConnection </p>
<p>mvarUseModem = lConnectionFlags And INTERNET_CONNECTION_MODEM </p>
<p>mvarUseLAN = lConnectionFlags And INTERNET_CONNECTION_LAN </p>
<p>mvarUseProxy = lConnectionFlags And INTERNET_CONNECTION_PROXY </p>
<p>mvarIsRasInstalled = lConnectionFlags And INTERNET_RAS_INSTALLED </p>
<p>mvarIsOffline = lConnectionFlags And INTERNET_CONNECTION_OFFLINE mvarIsConnectionConfigured = lConnectionFlags And _ INTERNET_CONNECTION_CONFIGURED </p>
<p>'Extract the name of current connection with the help </p>
<p>'of the pointer to the variable strConnectionName </p>
<p>mvarConnectionName = StringFromPointer(lPtr)</p>
<p></p>
<p>Just for information here is the function that extracts the string by the pointer.</p>
<p></p>
<p>Function StringFromPointer(ByVal lPointer As Long) As String </p>
<p></p>
<p>Dim strTemp As String </p>
<p>Dim lRetVal As Long </p>
<p></p>
<p>strTemp = String$(lstrlen(ByVal lPointer), 0) </p>
<p>lRetVal = lstrcpy(ByVal strTemp, ByVal lPointer) </p>
<p>If lRetVal Then StringFromPointer = strTemp </p>
<p></p>
<p>End Function</p>
<p></p>
<p>第二个不太明显的任务是在离线和在线两种状态间转换。看上去似乎比较复杂,实际上用一个WinInet函数InternetSetOption就行了。</p>
<p></p>
<p>Declare Function InternetSetOption Lib "wininet.dll" Alias "InternetSetOptionA" (ByVal hInternet As Long, ByVal dwOption As Long, lpBuffer As Any, ByVal dwBufferLength As Long) As Long</p>
<p></p>
<p>InternetSetOption函数可用来改变各种Internet设置及当前网络进程的参数。将第一个参数hInternet的值设为零,因为我们将要改变系统的参数。参数dwOption能接收一个Flag值,表示我们将要改变的设置。在这里我们将用到INTERNET_OPTION_CONNECTED_STATE。参数lpBuffer可以扮演多种角色。它可以接收或返回不同类型的值。本程序中将传递一个自定义类型,INTERNET_CONNECTED_INFO,给这个参数 </p>
<p></p>
<p>Type INTERNET_CONNECTED_INFO </p>
<p> dwConnectedState As Long </p>
<p> dwFlags As Long </p>
<p>End Type</p>
<p></p>
<p>为了调用InternetSetOption函数,我们必须首先初始化INTERNET_CONNECTED_INFO,其成员定义了系统要转换到的状态。下面是如何将系统转到在线状态。</p>
<p></p>
<p>Dim ConInfo As INTERNET_CONNECTED_INFO, lRetValue As Long </p>
<p></p>
<p>ConInfo.dwConnectedState = INTERNET_STATE_CONNECTED </p>
<p>lRetValue = InternetSetOption(0&, _ </p>
<p> INTERNET_OPTION_CONNECTED_STATE, _ </p>
<p> ConInfo, Len(ConInfo))</p>
<p></p>
<p>And this one is used to switch the system into Offline mode:</p>
<p></p>
<p>Dim ConInfo As INTERNET_CONNECTED_INFO, lRetValue As Long</p>
<p></p>
<p>ConInfo.dwConnectedState = INTERNET_STATE_DISCONNECTED_BY_USER </p>
<p>ConInfo.dwFlags = ISO_FORCE_DISCONNECTED </p>
<p>lRetValue = InternetSetOption(0&, _ </p>
<p> INTERNET_OPTION_CONNECTED_STATE, ConInfo, Len(ConInfo))</p>
<p></p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -