添加 c:/windows/system32/msinet.ocx
Inet控件也叫Internet Transfer 控件,這個控件封裝了http協定以及ftp協定,使用起來非常友善。是以大家經常使用。然而大家通常使用的隻是其部分功能,接下來我們講一下它的全部詳細功能,看過之後你也許會有眼前一亮的感覺。會猛然覺得我們之前懂得的隻是皮毛。
閑話少說,下面開講:
Internet Transfer 控件實作了兩種廣泛使用的 Internet 協定:超文本傳送協定(HyperText Transfer Protocol)(也就是HTTP) 和檔案傳送協定(File Transfer Protocol) (即FTP)。使用 Internet Transfer 控件可以通過 OpenURL 或 Execute 方法連接配接到任何使用這兩個協定的站點并檢索檔案。
可以做到的大體方向
在應用程式中添加 FTP 浏覽器。
建立自動從公共 FTP 站點下載下傳檔案的應用程式。
分析 World Wide Web 站點中的圖形引用,并隻下載下傳圖形。
提供以自定義格式顯示從 Web 頁獲得的動态資料。
基本操作
Internet Transfer 控件的功能依賴于将要使用的協定。由于所支援的兩種協定工作起來不盡相同,所能夠進行的操作就依賴于正在使用的協定。例如,GetHeader 方法隻能用于 HTTP(HTML 文檔)協定。
然而,有些過程對兩個協定是通用的。最基本的,如果要使用任何一個協定,則必須:
将 AccessType 屬性設定為合法的代理伺服器。
用合法的 URL 調用 OpenURL 方法。
用合法的 URL 和協定支援的指令調用 Execute 方法。
用 GetChunk 方法從緩沖區擷取資料。
設定 AccessType 屬性:使用代理伺服器
為了與 Internet 建立任何形式的連接配接,必須确定計算機如何連接配接到 Internet 上。如果在 intranet 上,可能需要提供代理伺服器才能連接配接到 Internet 上。
簡單地說,代理伺服器是計算機和 Internet 之間的媒介。intranet 上所有需要連接配接到 Internet 上的計算機,都必須通過代理伺服器。代理行使 intranet 和 Internet 之間的防火牆功能,能夠阻止非法的最終使用者和外部請求,也就保護了 intranet 不受破壞。
要查找計算機中的代理設定值,請按照以下步驟執行:
打開控制台的Internet選項。
在“Internet選項”對話框中,單擊“連接配接”。
在“代理伺服器”中,确認選中了“通過代理伺服器連接配接”複選框。
如果選中了,則單擊“設定”。在該對話框中可以找到能夠用于多種協定的代理伺服器的名稱。如果沒有定義代理伺服器,請與系統管理者聯系,以獲得可用的代理伺服器。
如果希望使用對話框中未列出的代理伺服器,可将 AccessType 屬性設定為 icNamedProxy (2)。然後将 Proxy 屬性設定為代理伺服器的名稱,如下面的代碼所示:
Inet1.Proxy = "myProxyName"
Inet1.AccessType = icNamedProxy
另一方面,如果希望使用預設代理伺服器(由計算機的系統資料庫決定),則可以忽略 Proxy 屬性,而隻需将 AccessType 設定為 icUseDefault (0)。
AccessType 的設定值在下表中列出:
常數 值 描述
icUseDefault 0 (預設)用作預設。控件使用系統資料庫中的預設設定通路 Internet。
icDirect 1 直接連接配接 Internet。該控件可直接連接配接到 Internet。
icNamedProxy 2 命名的代理伺服器。訓示該控件使用 Proxy 屬性确定的代理伺服器。
調用 OpenURL 方法
'名為“Text1”的 TextBox 控件儲存了
'該方法的結果。Internet 傳輸
'控件的名稱是“Inet1”。
作為結果,TextBox 控件儲存了 HTML 源碼,它看上去應和下圖顯示的相似:
在這種情況下,預設操作傳回的是 URL 定位的 HTML 文檔。然而,如果 URL 被改為指向文本檔案,則将獲得實際的檔案。例如,下面的代碼:
Text1.Text = Inet1. _
将獲得檔案的實際文本,如下所示:
提示 在使用 OpenURL 或 Execute 方法時,不需要設定 Protocol 屬性。Internet Transfer 控件會自動按 URL 的協定部分确定的協定來設定。
最後,可以用包含附加資料的 URL 調用 OpenURL 方法。例如,很多 Web 站點提供了搜尋資料庫的能力。要搜尋資料庫,則需要在發送的 URL 中包含搜尋條件。例如下面的代碼用條件“find=Maui”調用名為“search.exe”的搜尋引擎。
Dim strURL As String
strURL = "http://www.baidu.com/s?wd=ibiancheng"
Text1.Text = Inet1.OpenURL(strURL)
如果搜尋引擎找到了符合條件的内容,将合成一個 HTML 文檔并攜帶适當的資訊傳回。
用 OpenURL 方法儲存到檔案
如果需要将通過 OpenURL 方法擷取的資料儲存到檔案,可以使用 Open、Put 和 Close 語句,如下面的代碼所示。該示例先将獲得的二進制檔案傳入 Byte 數組,然後将該資料儲存到磁盤中:
Dim bData() As Byte '資料變量
Dim intFile As Integer '可用檔案變量
strURL = _
intFile = FreeFile() '将 intFile 設定為未使用的檔案
' OpenURL 方法的結果首先傳入 Byte 數組,
'然後将 Byte 數組儲存到磁盤。
bData() = Inet1.OpenURL(strURL, icByteArray)
Open "C:\Temp\Softlib.e xe" For Binary Access Write _
As #intFile
Put #intFile, , bData()
Close #intFile
可用類似的過程将文本檔案寫入磁盤中,不同的隻是不再需要 Byte 數組了,資料可以直接儲存到檔案中:
Dim strURL As String 'URL 字元串
IntFile = FreeFile()
Open "c:\temp\MSsource.txt" For Output _
As #IntFile
Write #IntFile, Inet1.OpenURL(strURL)
Close #IntFile
同步和異步傳輸
OpenURL 方法以同步方式傳輸資料。在這裡,同步指的是傳輸操作未完成之前,不能執行其它過程。這樣資料傳輸就必須在執行其它代碼之前完成。
而 Execute 方法以異步方式傳輸資料。在調用 Execute 方法時,傳輸操作與其它過程無關。這樣,在調用 Execute 方法後,在背景接收資料的同時,即可同時執行其它代碼。
對 Internet Transfer 控件的使用者來說這意味着什麼?簡單地說,用 OpenURL 方法能夠直接得到可儲存到磁盤的資料流(如上所述),或者直接在 TextBox 控件中閱覽(如果資料是文本格式的)。從另一方面說,如果用 Execute 方法擷取資料,則必須用 StateChanged 事件監視該控件的連接配接狀态。當達到适當的狀态時,調用 GetChunk 方法從控件的緩沖區擷取資料。下面更詳細地讨論這一操作。
在 FPT 協定中使用 Execute 方法
Execute 方法具有四個參數:url、operation、data 和 requestHeaders。FTP 操作隻用到了 operation 參數和 url 參數,其中後者是可選的。例如,要從遠端計算機中得到一個檔案,可用下面的代碼:
"GET disclaimer.txt C:\Temp\Disclaimer.txt"
如果正在用 FTP 從匿名 FTP 伺服器中擷取檔案,就應熟悉在伺服器目錄樹中漫遊的特定指令,以及将其中檔案擷取到本地的硬碟中的指令。例如,要用 FPT 協定改變目錄,應使用帶有希望改變到的目錄路徑的“CD”指令。
對絕大多數通用操作,如将檔案傳入伺服器,以及從伺服器擷取檔案,Internet 傳輸控件在 Execute 方法中使用了(與 FTP)相同或相近的指令。例如,下面的代碼将“CD”指令作為 Execute 方法的參數以改變路徑:
'txtURL 文本框包含了要打開的路徑。
'txtRemotePath 文本框包含了要改變到的路徑。
Inet1.Execute txtURL.Text, "CD " & txtRemotePath.Text
注意 在 Execute 方法中使用 FTP 指令時,沒有用到 data 和 requestHeaders 參數。所有的操作和它們的參數都在 operation 參數中作為字元串進行傳遞;參數之間用空格進行分隔。在下面的描述中,不要把“file1”和“file2”項與 data 和 requestHeaders 參數搞混。
FTP 操作的文法是:
operationName file1 file2
例如,要擷取檔案,在下面的代碼中包含了操作的名稱 (“擷取”),以及該操作所需的兩個檔案名:
'得到名為“Disclaimer.txt”的檔案,并将其複制到
' C:\Temp\Disclaimer.txt。
Inet1.Execute, _
"GET Disclaimer.txt C:\Temp\Disclaimer.txt"
下表列出了該控件支援的 FTP 指令:
操作 描述 示例
CD file1 改變目錄。改變到由 file1 指定的目錄中。 Execute , "CD docs\mydocs"
CDUP 改變到父目錄。功能與“CD ..”相同。 Execute , "CDUP"
DELETE file1 删除由 file1 指定的檔案。 Execute , "DELETE discard.txt"
DIR [file1] 在由 file1 指定的目錄中查找。如果沒有指定 file1 目錄,則查找目前工作目錄。使用 GetChunk 方法傳回資料。 Execute , "DIR /mydocs"
GET file1 file2 擷取由 file1 指定的遠端檔案,并建立由 file2 指定的新的本地檔案。 Execute , _
"GET getme.txt C:\gotme.txt"
MKDIR file1 建立由 file1 指定的目錄。是否能夠成功地執行,取決于使用者在遠端主機上的權限。 Execute , "MKDIR /myDir"
PUT file1 file2 将由 file1 指定的本地檔案,複制到由 file2 指定的遠端主機檔案中。 Execute , _
"PUT C:\putme.txt /putme.txt"
PWD 列印工作目錄。傳回目前目錄的名稱。用 GetChunk 方法傳回資料。 Execute , "PWD"
QUIT 結束目前連接配接。 Execute , "QUIT"
RECV file1 file2 與 GET 相同。 Execute , _
"RECV getme.txt C:\gotme.txt"
RENAME file1 file2 檔案重命名。是否能夠成功地執行,取決于使用者在遠端主機上的權限。 Execute ,
"RENAME old.txt new.txt"
RMDIR file1 删除目錄。是否能夠成功地執行,取決于使用者在遠端主機上的權限。 Execute , "RMDIR oldDir"
SEND file1 将檔案複制到 FTP 站點。(與 PUT 相同) Execute , _
"SEND C:\putme.txt /putme.txt"
SIZE file1 傳回由 file1 指定檔案的大小。 Execute "SIZE /largefile.txt"
重點 如果代理伺服器是 CERN 代理伺服器,就不允許使用直接的 FTP 連接配接(使用 Execute 方法)。在這種情況下,要獲得檔案,則需使用帶 Open、Put 和 Close 語句的 OpenURL 方法,就象前面“用 OpenURL 方法儲存到檔案”提到的那樣。還可以用 OpenURL 方法得到目錄清單,即将目标目錄作為 URL,并調用該方法。
在 HTTP 協定上使用 Execute 方法
HTTP 協定允許客戶機用 GET、HEAD、POST 和 PUT 指令向伺服器請求資料。下表中列出了這些操作:
"/Index.html", "GET"
HEAD 隻擷取 URL 屬性中命名的檔案的檔案标頭。 Execute , "HEAD"
POST 方法提供附加資料(學過網頁制作的或學過http協定的應該知道),以支援向遠端主機的請求。 Execute , "POST", strFormData
PUT 替換指定的 URL 中的資料。 Execute , "PUT", "replace.htm"
通用網關接口和 Execute 方法
很多 World Wide Web 站點提供了搜尋資料庫的能力。它是通過 HTTP 協定用通用網關接口 (CGI) 發送查詢的能力完成的。
在這裡不再讨論 CGI 了。然而,如果對 CGI 比較了解,就可用 Execute 方法構造一個應用程式模拟 World Wide Web 站點的行為。例如,下面的代碼給出了典型的 CGI 查詢字元串:
<a href="http://www.baidu.com/s?wd=ibiancheng">http://www.baidu.com/s?wd=ibiancheng</a>
如下所示,用 Execute 方法也可以發送同樣的查詢:
Dim strURL As String, strFormData As String
strFormData = "wd=ibiancheng"
Inet1.E xecute strURL, "POST", strFormData
如果希望得到從伺服器發回的結果(如上面的示例所示),就必須使用控件的 GetChunk 方法以擷取作為結果的 HTML 文檔。
在 State 事件中使用 GetChunk 方法
在從遠端計算機下載下傳資料時,将建立異步連接配接。例如,在 Execute 方法中使用“擷取”操作,将使伺服器擷取請求的檔案。當擷取了整個檔案之後,State 參數将傳回 icResponseCompleted (12)。在這時候,就可以用 GetChunk 方法從緩沖區中擷取資料了。下面的示例中給出了這種情況:
Private Sub Inet1_StateChanged(ByVal State As Integer)
Dim vtData As Variant '資料變量。
Select Case State
'...沒有給出其它情況。
Case icResponseCompleted '12
'打開檔案用于寫入。
Open txtOperation For Binary Access _
Write As #intFile
'得到第一個大塊。注意:指定 Byte 數組
' (icByteArray) 以擷取二進制檔案。
vtData = Inet1.GetChunk(1024, icString)
Do While LenB(vtData) > 0
Put #intFile, , vtData
'得到下一大塊。
vtData = Inet1.GetChunk(1024, icString)
Loop
Close #intFile
End Select
End Sub
登入到 FTP 伺服器
FTP 伺服器有兩種:公用的和私用的。公用伺服器,顧名思義,是對所有人開放的。而私用伺服器,除了該伺服器的真正使用者,其他人不能登入。在這兩種情況下,FTP 協定都要求提供使用者名和密碼。這兩個參數用來驗明使用者,并允許(或禁止)進一步的操作。
要登入到公用伺服器,通常的做法是以“匿名”登入 (UserName = "anonymous"),然後發送使用者的電子郵件名稱作為密碼。然而使用 Internet 傳輸控件這一過程還能夠進一步簡化。按照預設規定,如果沒有提供 UserName 和 Password 屬性值,該控件發送“匿名”作為 UserName,使用者的電子郵件名稱作為 Password。
如果要登入到私用伺服器,隻需适當地設定 UserName、Password 和 URL 屬性,并調用 Execute 方法,如下面的示例所示:
With Inet1
.UserName = "John Smith"
.Password = "mAuI&9$6"
.Execute ,"DIR" '傳回該目錄。
.Execute ,"CLOSE" '關閉連接配接。
End With
在調用 Execute 方法之後,FTP連接配接仍舊打開着。這時可以繼續使用 Execute 方法完成其它 FTP 操作,比如 CD 和 GET。如果會話已經完成,使用 Execute 方法執行 CLOSE 操作以關閉連接配接。也可以通過改變 URL 屬性,并調用 OpenURL 或 Execute 方法,自動關閉該連接配接,這樣的操作會關閉目前 FTP 連接配接,并打開新的 URL或IP。
結束