天天看點

一個封裝了WinInet API函數的類(CWinInetConnection) wininet.dll

 一個封裝了WinInet API函數的類(CWinInetConnection)

部分WinInet API函數允許你建立或斷開Internet連接配接,定義目前Internet連接配接及其屬性

。WinInet負責控制系統 線上和離線兩種狀态。當系統處于離線狀态時,IE會從Cache中

讀取所需的資料,如果是線上狀态,則 IE會從Internet上讀取資料。

注意

當處于線上狀态時,IE仍會首先在Cache中尋找你輸入的URL是否存在。如果是,IE會檢

查其真實性。IE會将在Cache

中資料的日期同伺服器上的資料的日期相比較。如果Cache中的資料是舊的話,則從服務

器上讀取資料。

CwinInetConnection實作了上述功能。它封裝了WinInet API函數,并使你能在下一個方

法或屬性中建立類的執行個體。

方法 描述

SetGlobalOnline 将系統轉換到線上狀态

SetGlobalOffline 将系統轉換到離線狀态

GoOnline 出現對話框,詢問是否需要将系統轉到線上狀态以擷取所需的資料。

AutoDial 出現建立預設連接配接對話框

Dial 出現建立使用者自定義連接配接對話框

AutoDialHangUp 在使用AutoDial方法後中斷目前連接配接

HangUp 使用Dial方法後中斷目前連接配接

Refresh 重新整理類的屬性

表一、 CWinInetConnection類所包含的方法

如你所見,上半部分用來顯示類的屬性。所有屬性,除ConnectionName外,都是布爾類

型。并且這些屬性是隻讀的。

屬性 描述

IsConnected 若傳回值為真,表明Internet連接配接已建立

ConnectionName 傳回目前活動連接配接的名稱

IsConnectionConfigured 若傳回值為真,表明系統的Internet連接配接設定正确

IsOffline 若傳回值為真,表明系統目前處于離線狀态

IsRasInstalled 若傳回值為真,表明系統已裝了遠端通路服務(RAS)

UseProxy 若傳回值為真,表明系統是通過代理伺服器連上Internet

UseLAN 若傳回值為真,表明系統通過區域網路連上Internet

UseModem 若傳回值為真,表明系統通過Modem撥号上網

表二、 CWinInetConnection的屬性

如果你想看看CWinInetConnection類是如何工作的,又或者想不用CWinInetConnection

類,自己調用WinInet API函數

----------------------------------------------------------------------------

----

在VB中用WinInet API函數并沒有什麼特别。你需要用到下面的幾個函數。

InternetAutodial

InternetAutodialHangup

InternetDial

InternetHangUp

InternetGoOnline

看看類的源代碼,就知道上面幾個函數的用法。是以這裡就不再多說。比較難的一個部

分是如何判斷系統是線上還是離線?這需要用到InternetGetConncedStateEx函數。該函

數不僅可以判斷是否已經建立了Internet連接配接,還能傳回一大堆連接配接的屬性。

在試着調用InternetGetConnectedStateEx函數,遇到了不小的麻煩。該函數的行為更象

是一個C語言函數。下面是該函數的聲明:

Declare Function InternetGetConnectedStateEx Lib "wininet.dll" Alias "Intern

etGetConnectedStateExA" (lpdwFlags As Long, lpszConnectionName As Long, dwNa

meLen As Long, ByVal dwReserved As Long) As Long

如果系統已經連上了Internet,該函數就會傳回一個非零的值。最後一個參數dwReserve

d,被留作以後擴充之用,在這裡它必須等于零。參數lpszConnectionName傳回一個字元

串,即目前連接配接的名稱。參數dwNameLen包含該字元串的大小。最後一個參數lpdwFlags

傳回一個類型為Long的值,其中包含一系列的屬性。下面是Refresh方法的部分代碼,其

主要目的是要調用InternetGetConnectedStateEx函數。

'Allocate buffer for the name of connection

strConnectionName = Space(256)

'Initialize variable lNameLen - the length of the buffer

lNameLen = 256

'Get the pointers to the variables we're going to pass

'to the function InternetGetConnectedStateEx

lPtr = StrPtr(strConnectionName)

lNameLenPtr = VarPtr(lNameLen)

'Call the InternetGetConnectedStateEx function.

'Please pay attention that two parameters are

'passing pass by the value (ByVal)

lRetVal = InternetGetConnectedStateEx(lConnectionFlags, ByVal lPtr, ByVal lN

ameLen, 0&)

'The processing of the lRetVal is missed

'Check the appropriate bits of the lConnectionFlags

'in order to initialize the properties of CWinInetConnection

mvarUseModem = lConnectionFlags And INTERNET_CONNECTION_MODEM

mvarUseLAN = lConnectionFlags And INTERNET_CONNECTION_LAN

mvarUseProxy = lConnectionFlags And INTERNET_CONNECTION_PROXY

mvarIsRasInstalled = lConnectionFlags And INTERNET_RAS_INSTALLED

mvarIsOffline = lConnectionFlags And INTERNET_CONNECTION_OFFLINE mvarIsConne

ctionConfigured = lConnectionFlags And  INTERNET_CONNECTION_CONFIGURED

'Extract the name of current connection with the help

'of the pointer to the variable strConnectionName

mvarConnectionName = StringFromPointer(lPtr)

Just for information here is the function that extracts the string by the po

inter.

Function StringFromPointer(ByVal lPointer As Long) As String

Dim strTemp As String

Dim lRetVal As Long

strTemp = String$(lstrlen(ByVal lPointer), 0)

lRetVal = lstrcpy(ByVal strTemp, ByVal lPointer)

If lRetVal Then StringFromPointer = strTemp

End Function

第二個不太明顯的任務是在離線和線上兩種狀态間轉換。看上去似乎比較複雜,實際上

用一個WinInet函數InternetSetOption就行了。

Declare Function InternetSetOption Lib "wininet.dll" Alias "InternetSetOptio

nA" (ByVal hInternet As Long, ByVal dwOption As Long, lpBuffer As Any, ByVal

 dwBufferLength As Long) As Long

InternetSetOption函數可用來改變各種Internet設定及目前網絡程序的參數。将第一個

參數hInternet的值設為零,因為我們将要改變系統的參數。參數dwOption能接收一個F

lag值,表示我們将要改變的設定。在這裡我們将用到INTERNET_OPTION_CONNECTED_STA

TE。參數lpBuffer可以扮演多種角色。它可以接收或傳回不同類型的值。本程式中将傳

遞一個自定義類型,INTERNET_CONNECTED_INFO,給這個參數

Type INTERNET_CONNECTED_INFO

dwConnectedState As Long

dwFlags As Long

End Type

為了調用InternetSetOption函數,我們必須首先初始化INTERNET_CONNECTED_INFO,其

成員定義了系統要轉換到的狀态。下面是如何将系統轉到線上狀态。

Dim ConInfo As INTERNET_CONNECTED_INFO, lRetValue As Long

ConInfo.dwConnectedState = INTERNET_STATE_CONNECTED

lRetValue = InternetSetOption(0&, INTERNET_OPTION_CONNECTED_STATE, ConInfo, 

Len(ConInfo))

And this one is used to switch the system into Offline mode:

Dim ConInfo As INTERNET_CONNECTED_INFO, lRetValue As Long

ConInfo.dwConnectedState = INTERNET_STATE_DISCONNECTED_BY_USER

ConInfo.dwFlags = ISO_FORCE_DISCONNECTED

lRetValue = InternetSetOption(0&, INTERNET_OPTION_CONNECTED_STATE, ConInfo, 

Len(ConInfo))

--