VB網(wǎng)頁抓取想要的_第1頁
VB網(wǎng)頁抓取想要的_第2頁
VB網(wǎng)頁抓取想要的_第3頁
VB網(wǎng)頁抓取想要的_第4頁
VB網(wǎng)頁抓取想要的_第5頁
免費預(yù)覽已結(jié)束,剩余10頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、在大多數(shù)情況下,上網(wǎng)沖浪是件令人愉快的事情。但若是數(shù)百上千的超鏈接擺在你面前,而你又不得不一一點擊這些鏈接、進(jìn)入相應(yīng)的網(wǎng)頁、手工篩選出每頁里你需要的信息、最后再將這些信息編進(jìn)數(shù)據(jù)庫中、, 你將做何感想?如果每天都從事這種繁雜、枯燥的工作會不會讓你發(fā)瘋?“自動上網(wǎng)機(jī)器人”或許可救你出“苦海 ”:你可以喝著咖啡、聽著音樂、看著 “機(jī)器人 ” 辛勤地替你工作,那感覺是不是棒極了!本文結(jié)合實例詳盡討論了用VB 實現(xiàn) “上網(wǎng)機(jī)器人” 的技術(shù)細(xì)節(jié)。我們知道,搜集和下載資料是人們使用互聯(lián)網(wǎng)的最主要的目的之一,但有些信息資源過于龐大,用手工摘取的方法是困難的或根本就是行不通的。例如, 你需要搜集歐洲進(jìn)口機(jī)械設(shè)

2、備的公司名錄以便給他們發(fā)信邀請其參加博覽會, 在網(wǎng)上找到這些信息并不難,但出于數(shù)據(jù)安全等方面的考慮,幾乎所有提供類似信息的網(wǎng)站都沒有提供直接下載數(shù)據(jù)的功能。要想搜集齊想要的數(shù)據(jù),唯一可用的方法就是一頁一頁地瀏覽每個公司的信息頁,摘取其中有用的數(shù)據(jù)并存入數(shù)據(jù)庫。但當(dāng)公司總數(shù)超過數(shù)千時,巨大的工作量會讓任何人望而卻步!其實,這浩大的工作完全可以由程序來完成,因為這些任務(wù)完全是機(jī)械的重復(fù)性工作。而且, 用程序完成比用手工要快得多。本文涉及的技術(shù)細(xì)節(jié)是通用的,即對實例程序稍加修改就可完成任何“自動上網(wǎng)沖浪”任務(wù)。自動撥號上網(wǎng)、自動處理中途掉線、任務(wù)完成后自動掛斷,這些都是“上網(wǎng)機(jī)器人”的最基本的功能之

3、一。它還能給你帶來明顯的經(jīng)濟(jì)回報:如果你讓“機(jī)器人 ”在晚間至凌晨的上網(wǎng)費優(yōu)惠期內(nèi)撥號上網(wǎng)去自動沖浪,那真可稱得上是典型的“一石三鳥”你睡覺、它工作、還省錢!有關(guān)這方面的細(xì)節(jié)將在本文的第三部分里討論。該部分提供了實現(xiàn)上述各功能的若干方法,并比較了這些方法各自的優(yōu)劣。本文的第一和第二部分分別以兩個實例討論了自動瀏覽的技術(shù)細(xì)節(jié):在網(wǎng)頁上的輸入?yún)^(qū)內(nèi)自動填入數(shù)據(jù)以便完成諸如用戶登錄等的操作、自動更新CheckBox 、自動選擇下拉式列表( ComboBox )的值、自動點擊網(wǎng)頁上的按鈕、從網(wǎng)頁上精確提取有用的數(shù)據(jù)并存盤、將網(wǎng)頁上二維表(Table)內(nèi)的數(shù)據(jù)一一提取出來并轉(zhuǎn)換且存儲成可直接導(dǎo)入數(shù)據(jù)庫或E

4、xcel 的格式,以及控制瀏覽進(jìn)程的技巧等等。第一部分從網(wǎng)頁上精確提取數(shù)據(jù)本部分的實例是:下載滬深兩市全部約1100 家個股的基本信息及財務(wù)數(shù)據(jù)。若用手工操作,如上圖所示,需要在股票代碼區(qū)內(nèi)分別輸入1100 個股票代碼,在下拉式列表(ComboBox )中分別選擇“個股資料”和 “ 財務(wù)數(shù)據(jù)解讀”,算下來約是2200 次操作!這樣的工作當(dāng)然是由程序來完成劃算得多。況且手工提取數(shù)據(jù)(先選中、再使用Ctrl+C 拷貝)極容易出錯(多選或漏選),又很費眼神。1. 在輸入?yún)^(qū)內(nèi)自動填入數(shù)據(jù)為使程序能高效地自動瀏覽,需引入一些最基本的功能,如在輸入?yún)^(qū)內(nèi)自動填入數(shù)據(jù)、自動點擊按鈕等等。雖然用變換URL 地址

5、的方法有時也能完成任務(wù),但往往過于費力,尤其當(dāng)網(wǎng)頁上的輸入?yún)^(qū)較多時更是如此。為了在輸入?yún)^(qū)內(nèi)輸入數(shù)據(jù),需要先搜索到該對象的名字,然后將該對象的值置為要填入的數(shù)據(jù)即可。搜索名字的工作可編程完成,亦可用FrontPage 輕松獲得。2. 自動在下拉式列表(ComboBox )中進(jìn)行選擇同樣地,首先要獲得下拉式列表的名字。然后根據(jù)下拉式列表的元素總數(shù)(length 屬性) 在列表中搜索要設(shè)置的值(列表的Options 集合中元素的Text 屬性) ,找到后,將該元素設(shè)為選中元素(元素的Selected 屬性) 。3. 自動點擊按鈕對于按鈕來講,可根據(jù)其名字訪問,亦可根據(jù)其值訪問。按鈕的值就是顯示在按鈕

6、上的文字。一個按鈕可能沒有名字,但一定有值。本例的程序就是根據(jù)值來訪問按鈕。執(zhí)行按鈕的Click方法就相當(dāng)于點擊了該按鈕。圖二中紅色箭頭所指即為程序自動填入輸入框、自動在ComboBox 中選擇以及自動點擊按鈕4. 精確提取數(shù)據(jù)僅將有用的數(shù)據(jù)存儲下來才是有意義的。必須研究網(wǎng)頁,找出有效數(shù)據(jù)所在的Tag 區(qū)(可用文本編輯器或FrontPage) ,然后用該對象的innerText 屬性獲得最終的文本。本例中要存儲的數(shù)據(jù)如下圖所示,其所用的Tag 為 “ PRE”。下面給出的是實例程序的完整代碼:' 程序一:從網(wǎng)頁上精確提取數(shù)據(jù) '' 為運(yùn)行本程序,應(yīng)在“菜單 -工程-部件

7、”中添加 “ Microsoft Internet Controls' 并在 “菜單 -工程 -引用 ”中添加 “ Microsoft HTML Object Library ” '' 為了簡潔,程序僅下載九只個股的基本信息Option ExplicitPrivate Const Form_ID = 1Dim Code(9) As StringDim Current As LongPrivate Sub Form_Load() Form1.MousePointer = 11 ' 以下是個股代碼 ' 為了程序簡潔,這里僅使用九只代碼。' 而在真實環(huán)

8、境中,應(yīng)從數(shù)據(jù)文件中讀入全部個股代碼。Code(0) = "600001": Code(1) = "600002": Code(2) = "600003"Code(3) = "600005": Code(4) = "600006": Code(5) = "600007"Code(6) = "600008": Code(7) = "600009": Code(8) = "600010"Current = 0WebBro

9、wser1.Navigate "" ' 起始網(wǎng)址End SubPrivate Sub WebBrowser1_DocumentComplete(ByValpDisp As Object, URL As Variant)Dim i, kText2 = WebBrowser1.LocationURL ' 顯示當(dāng)前網(wǎng)址' 判斷當(dāng)前網(wǎng)頁是否全部調(diào)入完畢If Not (pDisp Is WebBrowser1.Object) Then Exit SubOn Error Resume NextSelect Case Text2Case " '

10、當(dāng)進(jìn)入主頁面時執(zhí)行以下程序For i = 0 To WebBrowser1.Document.Forms(Form_ID).length - 1' 找到代碼輸入框后填入個股代碼If WebBrowser1.Document.Forms(Form_ID)(i).Name = "code" Then _WebBrowser1.Document.Forms(Form_ID)(i).Value = Code(Current)' 在下拉式列表中進(jìn)行選擇If WebBrowser1.Document.Forms(Form_ID)(i).Name = "targ

11、et" ThenFor k = 0 To WebBrowser1.Document.Forms(Form_ID)(i).length - 1If WebBrowser1.Document.Forms(Form_ID)(i).Options(k).Text _= " 個股資料" ThenWebBrowser1.Document.Forms(Form_ID)(i).Options(k).Selected = TrueExit ForEnd IfNext kEnd If' 點擊按鈕If WebBrowser1.Document.Forms(Form_ID)(i)

12、.Value = " 查詢 " Then _WebBrowser1.Document.Forms(Form_ID)(i).ClickNextCase Else ' 當(dāng)進(jìn)入數(shù)據(jù)頁面時執(zhí)行以下程序For i = 0 To WebBrowser1.Document.All.length - 1If WebBrowser1.Document.All(i).tagName = "PRE" Then' 精確提取數(shù)據(jù)Text1 = Text1 + Code(Current) + vbCrLf + _WebBrowser1.Document.All(i)

13、.innerText + vbCrLfExit ForEnd IfNext' 數(shù)據(jù)存盤Open "C:Data2.Txt" For Append As #1Print #1, Text1: Text1 = "": Close #1' 換下一只股票Current = Current + 1If Current >= 9 Then' 上網(wǎng)任務(wù)完成后,應(yīng)在此調(diào)用自動掛斷過程。Form1.MousePointer = 0: MsgBox "Finished!": EndEnd If' 回退到主頁面,查詢下

14、一只股票的信息WebBrowser1.GoBackEnd SelectEnd Sub第二部分將網(wǎng)頁上的二維表導(dǎo)入數(shù)據(jù)庫在上一部分中,我們討論了讓程序自動在網(wǎng)上瀏覽并將所需的數(shù)據(jù)準(zhǔn)確、快速地存儲下來的方法?,F(xiàn)在,我們將迎接更大的挑戰(zhàn):將網(wǎng)頁上以表格形式存在的二維數(shù)據(jù)提取出來,并存成可直接導(dǎo)入數(shù)據(jù)庫的“ Microsoft Excel 逗號分隔值文件”(即 .csv 文件) 。用手工在網(wǎng)頁上直接提取類似上圖中所示的表格數(shù)據(jù)是非常困難的。如果這樣的表格有數(shù)十 頁甚至上百頁之多,手工提取工作將是不可想象的,而且非常容易出錯。本部分的實例是:將滬深兩市全部約1100 家個股的財務(wù)評分表數(shù)據(jù)(共54 頁,

15、每頁20 家,如上圖所示)快速、準(zhǔn)確地轉(zhuǎn)換成“ .csv文件。 ”1. 自動設(shè)置CheckBox 的值由于只有注冊用戶才能訪問上述財務(wù)評分表,因此實例程序首先演示了自動注冊的功能。下我們在上一部分中已討論了自動填寫輸入?yún)^(qū)以及自動點擊按鈕等的方法。對于自動設(shè)置CheckBox 值,其方法完全類似:首先要搜索到該CheckBox 的名字,然后將該對象的Checked屬性置為True 或 False 即可。2. 將網(wǎng)頁上的二維表導(dǎo)入數(shù)據(jù)庫首 先 定 義 一 個 IHTMLElementCollection 對 象 用 于 收 集 網(wǎng) 頁 上 所 有 的 Table , 然 后 用 getElemen

16、tsByTagName 方法執(zhí)行收集工作:Dim Tables AsIHTMLElementCollectionSet Tables = WebBrowser1.Document.getElementsByTagName("Table")一個網(wǎng)頁上往往有多個Table。我們用HTMLTable 對象來處理每個Table:Dim Table1 AsHTMLTableFor Each Table1 In TablesNextHTMLTable 對象的 innerText 屬性記錄了整個Table 的全部信息,包括字段名。因此我們可以根據(jù)字段名判斷出哪個Table 是我們需要的。

17、為了逐行逐列地提取數(shù)據(jù),我們還需要HTMLTableRow 對象和 HTMLTableCell 對象:Dim Row AsHTMLTableRow, Cell As HTMLTableCellFor i = 1 To Table1.rows.length - 1 ' 逐行處理Set Row = Table1.rows(i)j = 0For Each Cell In Row.cells ' 逐列處理' Row.cells(j).innerText 即為當(dāng)前行及當(dāng)前列上的單元數(shù)據(jù)Text1 = Text1 + Trim(Row.cells(j).innerText) + &

18、quot;,"j = j + 1Next' 一行處理完畢后,去除行尾的逗號并加上回車Text1 = Left(Text1, Len(Text1) - 1) + vbCrLfNext至此,當(dāng)前網(wǎng)頁上的二維表已轉(zhuǎn)換成“ .csv格式。 ”3. 自動瀏覽時的頁面控制技巧我 們 從 上 個 例 子 中 就 已 經(jīng) 清 晰 地 看 到 , 自 動 瀏 覽 程 序 的 主 體 是 WebBrowser 控 件 的 DocumentComplete 事件。只有在當(dāng)前頁面已被完全調(diào)入后,我們才能開始對當(dāng)前頁面進(jìn)行數(shù)據(jù)處理,然后再根據(jù)當(dāng)前在哪個頁面來決定下一步的瀏覽方向。需要指出的是,Docu

19、mentComplete 事件的發(fā)生并不一定意味著當(dāng)前頁面已被全部調(diào)入。如果頁面上沒有其它子框架(frames) ,發(fā)生 DocumentComplete 事件即表明當(dāng)前頁面(即主框架)已完成調(diào)入;若頁面上有多個框架,則每個框架完成時都會發(fā)生DocumentComplete 事件;當(dāng)所有子框架都完成后,主框架最后產(chǎn)生一次DocumentComplete 事件。為了判斷出這最后一次DocumentComplete 事件,需要比較每次事件發(fā)生時的對象(pDisp )是否是WebBrowser 控件對象本身:Private Sub WebBrowser1_DocumentComplete(ByVal

20、pDisp As Object, _URL As Variant)If (pDisp Is WebBrowser1.Object) ThenDebug.Print "Document is finished loading.End IfEnd Sub下面是實例程序的完整代碼(運(yùn)行該程序可得到完整的1061 行 “ .csv格式的數(shù)據(jù),分別代表 ”1061 個上市公司的財務(wù)信息。該文件可直接導(dǎo)入Access 數(shù)據(jù)庫或Excel 中。 ) :' 程序二:將網(wǎng)頁上的二維表導(dǎo)入數(shù)據(jù)庫'' 為運(yùn)行本程序,應(yīng)在“菜單 -工程 -部件 ”中添加 “ Microsoft In

21、ternet Controls ”' 并在 “菜單-工程-引用 ”中添加 “ Microsoft HTML Object Library ”'Option ExplicitDim Page As LongPrivate Sub Form_Load()Form1.MousePointer = 11WebBrowser1.Navigate "" ' 起始網(wǎng)址 End SubPrivate Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)Dim Table1 As

22、 HTMLTable, Tables As IHTMLElementCollectionDim Row As HTMLTableRow, Cell As HTMLTableCellDim i, j, tmpText2 = WebBrowser1.LocationURL ' 顯示當(dāng)前網(wǎng)址' 判斷當(dāng)前網(wǎng)頁是否全部調(diào)入完畢If Not (pDisp Is WebBrowser1.Object) Then Exit SubOn Error Resume NextSelect Case Text2Case " ' 當(dāng)進(jìn)入主頁面時執(zhí)行以下程序 ' 用戶注冊登錄Fo

23、r i = 0 To WebBrowser1.Document.Forms(0).length - 1' 找到 CheckBox 后,將其值改為False,以防止用戶名及密碼被存儲If WebBrowser1.Document.Forms(0)(i).Name = "checkSavePW" Then _WebBrowser1.Document.Forms(0)(i).Checked = FalseIf WebBrowser1.Document.Forms(0)(i).Name = "userId" Then _WebBrowser1.Docum

24、ent.Forms(0)(i).Value = "kompass_china"If WebBrowser1.Document.Forms(0)(i).Name = "passwd" Then _WebBrowser1.Document.Forms(0)(i).Value = "kompass1"' 此處是按名字訪問按鈕(上例中是按值訪問按鈕)If WebBrowser1.Document.Forms(0)(i).Name = "continue" Then _WebBrowser1.Document.For

25、ms(0)(i).ClickNextCase "' 當(dāng)用戶登錄完成后,準(zhǔn)備打開表格的第一頁WebBrowser1.Navigate " + _"showstkdfpm&begin=0&ret=1&index=2&concode=01"Page = 1Case Else ' 當(dāng)進(jìn)入數(shù)據(jù)頁面(表格的第一頁至最后一頁)時執(zhí)行以下程序Set Tables = WebBrowser1.Document.getElementsByTagName("Table") For Each Table1 In

26、 TablesIf Left(Table1.innerText, 2) = " 名次 " Then ' 找到需要的Table' 將表格轉(zhuǎn)換成“ .csv格式 ”For i = 1 To Table1.rows.length - 1Set Row = Table1.rows(i) j = 0For Each Cell In Row.cellsText1 = Text1 + Trim(Row.cells(j).innerText) + "," j = j + 1NextText1 = Left(Text1, Len(Text1) - 1) +

27、 vbCrLfNext ' 數(shù)據(jù)存盤Open "C:Data.csv" For Append As #1Print #1, Left(Text1, Len(Text1) - 2): Text1 = "": Close #1Exit ForEnd IfNext ' 準(zhǔn)備打開下一頁P(yáng)age = Page + 1tmp = " + _ Trim(Str(Page) + "&index=2&concode=01"If Page <= 54 Then ' 判斷是否瀏覽結(jié)束WebBrowse

28、r1.Navigate tmpElse ' 上網(wǎng)任務(wù)完成后,應(yīng)在此調(diào)用自動掛斷過程。Form1.MousePointer = 0 MsgBox "Finished!": End End IfEnd SelectEnd Sub以下給出的是上述程序所存數(shù)據(jù)文件的片段:1,樂凱膠片,600135,材料 ,81.493,18.445,23.165,8.850,20.717,10.3152,歌華有線,600037,傳播娛樂,80.553,13.009,22.256,12.141,20.304,12.8443,外運(yùn)發(fā)展,600270,倉儲運(yùn)輸,80.326,17.331,23.

29、005,8.829,19.900,11.2614,東方鉭業(yè),0962,有色金屬,80.312,15.160,22.483,11.648,21.290,9.7305,雙匯發(fā)展,0895,食品,79.772,15.428,20.673,11.508,20.235,11.9306,四川美豐,0731,化肥,79.361,15.795,23.235,11.323,16.921,12.0881059,輪胎橡膠,600623, 車類 ,7.167,8.265,10.973,-34.411,14.120,8.2191060,PT 吉輕工 ,0546,日用輕工產(chǎn)品,-11.895,5.740,-49.149,

30、7.999,14.136,9.3791061,廣船國際,600685, 機(jī)械儀器,-57.452,9.824,-1.528,-89.648,14.366,9.533第三部分自動撥號、自動掛斷以及自動處理中途掉線一個出色的“自動上網(wǎng)機(jī)器人”程序應(yīng)能按照既定的時間準(zhǔn)時開始撥號、并當(dāng)所需任務(wù)已完成后立即掛斷。而且僅做到這些還不夠,它還應(yīng)在發(fā)出撥號指令后跟蹤撥號操作是否真的成功、上網(wǎng)速度如何、是否需要掛斷后重新?lián)芴?、自動瀏覽過程中是否出現(xiàn)掉線、以及最終的掛斷操作是否真的成功完成,等等。因此, “機(jī)器人 ”程序應(yīng)定時檢查在線狀況,以保證瀏覽時一定在在線狀態(tài)、瀏覽完畢后一定不在在線狀態(tài)。同時還要檢查瀏覽進(jìn)

31、度,當(dāng)瀏覽速度過慢時嘗試掛斷后重新?lián)芴?。本部分討論了實現(xiàn)“自動撥號”、 “檢查在線狀況”、 以及 “自動掛斷”這三個功能的若干方法,比較了諸方法各自的優(yōu)劣,并總結(jié)給出了使用建議。本部分的示例程序?qū)⑦@三個功能的諸方法集成在一起,以便于大家對比使用(見下圖)。1. 自動撥號方法 1A:使用 rnaui.dllrnaui.dll 是微軟的“撥號網(wǎng)絡(luò)用戶接口”程序集,一般在“System ”目錄下。其中的RnaDial 程序用于啟動撥號。該程序可在命令行執(zhí)行(在“開始 ” ->“運(yùn)行” 中鍵入) :rundll32.exe rnaui.dll,RnaDial < 撥號網(wǎng)絡(luò)連接名>其中

32、的 “ RnaDial和 ”“< 撥號網(wǎng)絡(luò)連接名>”是區(qū)分大小寫的。但由于上述命令僅啟動撥號窗口而未立即開始撥號,因此在程序中使用時還應(yīng)再送出模擬“回車 ”的按鍵:ret = Shell("rundll32.exe rnaui.dll,RnaDial " + 連接名 , 1)SendKeys "enter", True方法 1B :使用 wininet.dllwininet.dll 是 微 軟 的 Internet 擴(kuò) 充 函 數(shù) 集 , 一 般 在 “System ”目 錄 下 。 其 中 的InternetAutodial 、 Inter

33、netAutodialHangup 和 InternetGetConnectedState 三個函數(shù)分別可完成自動撥號、自動掛斷和判斷在線狀態(tài)等任務(wù)。InternetAutodial 的定義為:Private Declare Function InternetAutodial Lib "wininet.dll"(ByValdwFlags As Long, ByValdwReserved As Long) As Long若將第一個參數(shù)(dwFlags)的值設(shè)為2,該函數(shù)無需用戶干預(yù)就可自動撥號。但使用該函數(shù)有一個前提:即必須將“ Internet 屬性”->“連接”設(shè)成

34、 “始終撥打默認(rèn)連接”(見下圖)。用 InternetAutodial 函數(shù)自動撥號的情況可參見下圖。從圖中可以看出,該方法可自動重試多次。具體的重試次數(shù)在默認(rèn)連接的“設(shè)置”->“高級”中定義:方法 1C:使用 RASRAS 是微軟的遠(yuǎn)程訪問服務(wù)(Remote Access Service) API 集合。其中的API 函數(shù) RasDial可完成撥號任務(wù)。但由于該函數(shù)在使用上略顯復(fù)雜而不太常用,故示例程序中未采納。自動撥號方法小結(jié):rnaui 方法使用起來最簡單,又由于它不一定非要使用默認(rèn)連接,因此也最靈活。 但這種靈活恰恰又給它帶來了弱點,即如果不提供連接名,該方法不會自動調(diào)用默認(rèn)連接

35、。此外,這種方法還有兩個最大的缺點:一是僅撥號一次,若出現(xiàn)占線或沒有響應(yīng)等情況時不會自動重試;二是調(diào)用程序不容易得到撥號是否成功的返回值。相比之下,wininet 方法雖僅能撥打默認(rèn)連接(無默認(rèn)連接時,使用第一個連接),但它可多次試撥,并且InternetAutodial 函數(shù)等待撥號成功或所有試撥結(jié)束以便給調(diào)用程序返回?fù)芴柺欠癯晒Φ闹?,因此,在“自動上網(wǎng)機(jī)器人 ” 的環(huán)境中wininet 方法是最適宜的。2. 檢查在線狀況方法 2A: wininet 方法若 InternetGetConnectedState 函數(shù)返回True,則為在線狀態(tài)。該方法最大的缺點是:若當(dāng)前連接不是用wininet

36、 方法建立的,則返回值可能不準(zhǔn)確。方法 2B :查找窗口法撥號連接成功后,下圖所示的窗口一定存在(不管它是最小化在任務(wù)欄的最右端,或是開啟為下圖所示的狀態(tài)):用 FindWindow API 函數(shù)找到該窗口即意味著當(dāng)前在線。此外, 查找窗口法的另一個用處是查找 “ 重新連接” 窗口:當(dāng)中途掉線時,操作系統(tǒng)往往會詢問你是否重新連接,找到該窗口并發(fā)出模擬 “ 回車 ” 按鍵即可實現(xiàn)再撥號。查找窗口法的缺點是:由于找窗口時需要提供窗口標(biāo)題,因此即使使用的是默認(rèn)連接也必須事先知道默認(rèn)連接名。方法 2C: RAS 方法先用 RasEnumConnections 函數(shù)返回整個RAS 集合,再用RasGet

37、ConnectStatus 函數(shù)判斷第一個 RAS 連接的狀態(tài)。RAS 方法的最大優(yōu)點是:不管當(dāng)前連接是否是用wininet 建立的,RAS 方法均可對在線狀態(tài)做出正確判斷。方法 2D:注冊表法在線時,注冊表的“RemoteAccess ”處有鍵值 “ RemoteConnection ,且其值不為零;不在線時,該處無”“ Remote Connection鍵值(當(dāng)本次系統(tǒng)啟動后從 ”未撥號成功時),或者其值為零(表明曾撥號成功,但現(xiàn)在已斷掉)。檢查在線狀況之方法小結(jié):由于wininet 方法的局限性,一般我們應(yīng)避免使用之;查找窗口法是可靠的,只是要知道連接名;因此我們推薦使用RAS 方法和注

38、冊表法。3. 自動掛斷方法 3A: wininet 法使用 InternetAutodialHangup 函數(shù)。 同樣地, 若當(dāng)前連接不是用wininet 方法建立的,則返回值可能不準(zhǔn)確(即不能成功掛斷)。方法 3B:窗口查找法找到圖九所示的窗口,然后用ShowWindow API 函數(shù)使之成為當(dāng)前窗口,最后發(fā)出模擬+C 的按鍵操作(從圖九中可以看出,+C 是 “斷開連接”按鍵的快捷方式)。方法 3C: RAS 法用 RasHangUp 函數(shù)執(zhí)行掛斷。不管用何種方法建立的連接,RAS 法均能可靠地完成任自動掛斷方法小結(jié):相比之下,窗口查找法和RAS 法是可以信賴的。4. 本部分總結(jié)綜上所述,對

39、于“自動撥號”、 “檢查在線狀況”、以及 “自動掛斷”的各種方法,我們推薦“ 1A-2C-3C”組合。當(dāng)然各方法可綜合使用(如加入2D、 3B 等) ,以確保萬無一失。在具體編程時還應(yīng)注意:撥號后判斷結(jié)果,如不成功應(yīng)重新?lián)芴?;任?wù)進(jìn)行過程中定時檢查在線狀態(tài),出現(xiàn)掉線后應(yīng)及時處理;最后的掛斷操作后應(yīng)再查在線狀態(tài),以確保掛斷成功。源代碼中的全局定義已按照wininet 、 RAS、 注冊表等進(jìn)行分類,各具體方法也均按序排列,以便于大家挑選使用。該程序的執(zhí)行情況在本部分的開始處已給出(圖六) 。' 程序三:自動撥號、自動掛斷以及自動處理中途掉線'Option Explicit'

40、; 有關(guān) wininet 的全局定義Private Const INTERNET_AUTODIAL_FORCE_UNATTENDED = 2Private Const INTERNET_CONNECTION_MODEM = 1Private Declare Function InternetAutodial Lib "wininet.dll" _(ByVal dwFlags As Long, ByVal dwReserved As Long) As LongPrivate Declare Function InternetAutodialHangup Lib _"

41、wininet.dll" (ByVal dwReserved As Long) As LongPrivate Declare Function InternetGetConnectedState Lib _"wininet.dll" (ByRef lpdwFlags As Long, ByVal _dwReserved As Long) As Long' 有關(guān) “窗口查找”的全局定義Private Declare Function FindWindow Lib "user32" _Alias "FindWindowA"

42、; (ByVal lpClassName As String, _ByVal lpWindowName As String) As LongPrivate Declare Function ShowWindow Lib "user32" _(ByVal hwnd As Long, ByVal nCmdShow As Long) As LongPrivate Const SW_SHOW = 5' 有關(guān) RAS 的全局定義Private Const RASCS_DONE = &H2000&Private Const RAS_MaxEntryName =

43、256Private Const RAS_MaxDeviceType = 16Private Const RAS_MaxDeviceName = 128Private Type RASCONNdwSize As LonghRasConn As LongszEntryName(RAS_MaxEntryName) As ByteszDeviceType(RAS_MaxDeviceType) As ByteszDeviceName(RAS_MaxDeviceName) As ByteEnd TypePrivate Type RASCONNSTATUSdwSize As LongRasConnStat

44、e As LongdwError As LongszDeviceType(RAS_MaxDeviceType) As ByteszDeviceName(RAS_MaxDeviceName) As ByteEnd TypePrivate Ras_Buf(255) As RASCONNPrivate Ras_Status As RASCONNSTATUSPrivate lpcb As LongPrivate lpcConnections As LongPrivate Declare Function RasEnumConnections Lib _ "rasapi32.dll"

45、 Alias "RasEnumConnectionsA" (lprasconn _ As Any, lpcb As Long, lpcConnections As Long) As Long Private Declare Function RasGetConnectStatus Lib _ "rasapi32.dll" Alias "RasGetConnectStatusA" (ByVal _ hRasConn As Long, lpRASCONNSTATUS As Any) As Long Private Declare Func

46、tion RasHangUp Lib "rasapi32.dll" _ Alias "RasHangUpA" (ByVal hRasConn As Long) As Long ' 有關(guān) “注冊表 ”的全局定義Private Const HKEY_LOCAL_MACHINE = &H80000002Private Declare Function RegOpenKey Lib "advapi32.dll" Alias _ "RegOpenKeyA" (ByVal hKey As Long, ByVal

47、 lpSubKey As _ String, phkResult As Long) As LongPrivate Declare Function RegQueryValueEx Lib "advapi32.dll" _ Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal _ lpValueName As String, ByVal lpReserved As Long, lpType _ As Long, lpData As Any, lpcbData As Long) As Long Private

48、 Declare Function RegCloseKey Lib "advapi32.dll" _ (ByVal hKey As Long) As Long Dim ret As Long '自動撥號 Private Sub wininet 撥號測試_Click()If InternetAutodial(INTERNET_AUTODIAL_FORCE_UNATTENDED, 0) _ Then MsgBox " 已連接(wininet 法) "End SubPrivate Sub rnaui 撥號測試_Click()ret = Shell(&q

49、uot;rundll32.exe rnaui.dll,RnaDial " + Text1, 1): DoEvents SendKeys "enter", True: DoEvents End Sub'檢查是否斷線Private Sub wininet 方法 _Click() ' wininet 法檢查是否斷線If InternetGetConnectedState(INTERNET_CONNECTION_MODEM, 0) Then MsgBox " 在線 "ElseMsgBox " 當(dāng)前未連接。"End I

50、fEnd SubPrivate Sub 查找窗口法_Click() ' 查找窗口法檢查是否斷線ret = FindWindow("#32770", " 重新連接")If ret <> 0 ThenCall ShowWindow(ret, SW_SHOW) SendKeys "enter", True: Exit SubEnd Ifret = FindWindow("#32770", " 連接到 The95963")If ret <> 0 ThenMsgBox " 在線 "ElseMsgBox " 當(dāng)前未連接。"End IfEnd SubPrivate Sub RAS 方法 _Click() ' RAS 方法檢查是否斷線Ras_Buf(0).dwSize = Len(Ras_Buf(0) + 1lpcb = 256 * Ras_Buf(0).dwSizeret = RasEnumConnections(Ras_B

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論