隨著因特網的快速發展,現在程式設計常需要在程式中直接連網來處理一些事項,如線上註冊和線上幫助,這就要求我們要在程式中建立某些連線。許多軟體在不知用戶是否連網的情況下不管三七二十一就啟動瀏覽器查找網址,費了九牛二虎之力只能查出一錯誤頁來(當然不可能有什麼好的結果)。如果我們在程式編寫時能自動判斷使用者是否已經連網,如已經連網則開啟聯接,如沒有則啟動預設的撥號連接,這樣是不是讓人覺得你的軟體更勝人一處呢?判斷是否已連網很多地方都有介紹,這裡我們只介紹如何啟動預設的撥接連線。
----在介紹之前讓我們先看看如何開啟撥號網路。由於撥接網路不是可執行文件,所以不能用「Shell可執行檔」的方式來開啟。要啟動撥號網絡,需使用Explorer,方法如下:
Shell"Explorer::{20D04FE0-3AEA-1069-A2D8-08002B30309D}/"&"::{992CFFA0-F557-101A-88EC-00DD010CCC48}",vbNormalFocus
----但若是要啟動撥號網路中的某一個連接,則需藉助rundll.exe及rnaui.dll來啟動,方法如下(假定連接名稱為163):
Shell"rundllrnaui.dll,RnaDial163",vbNormalFocus
----說明:在以上敘述中,「,RnaDial163」這部分不要插入額外的空格,大小寫也不要任意更改。
----上面僅僅假定了連接名稱,但實際編程中我們是不知道其名稱的,如何取得預設的連接名稱並啟動它呢?這裡我們可利用註冊表來達到目的。完整程序如下:
----在窗體上放置一個指令按鈕(名稱為cmdCallConnect),以下為代碼部份:
OptionExplicit
'有關註冊的API聲明
PRivateDeclareFunctionRegOpenKeyExLib"advapi32"Alias"RegOpenKeyExA"(ByValhKeyAsLong,ByVallpSubKeyAsString,ByValulOptionsAsLong,ByValsamDesiredAsLong,phkResultAsLong)AsOptionsAsLong,ByValsamDesiredAsLong,phkResultAsLong)AsOptionong
PrivateDeclareFunctionRegQueryValueExLib"advapi32"Alias"RegQueryValueExA"(ByValhKeyAsLong,ByVallpValueNameAsString,ByVallpReservedAsLong,ByReflpTypeAsLong,ByValszDataAsString,ByReflpcongAs
PrivateDeclareFunctionRegCloseKeyLib"advapi32"(ByValhKeyAsLong)AsLong
'常數
ConstHKEY_CURRENT_USER=&H80000001
ConstERROR_SUCCESS=0&
PrivateSubcmdCallConnect_Click()
'啟動預設撥號連接
Shell"rundllrnaui.dll,RnaDial" GetConnect,vbNormalFocus
EndSub
PublicFunctionGetConnect()AsString
DimhKeyAsLong
DimSubKeyAsString
hKey=HKEY_CURRENT_USER'主鍵
SubKey="Remoteaccess"'子鍵
'取得預設連線名
GetConnect=GetRegValue(hKey,SubKey,"Default")
EndFunction
PublicFunctionGetRegValue(hKeyAsLong,lpszSubKeyAsString,szKeyAsString)AsVariant
OnErrorGoToErrorRoutineErr:
DimphkResultAsLong
DimlResultAsLong
DimszBufferAsString
DimlBuffSizeAsLong
'建立緩衝區
szBuffer=Space(255)
lBuffSize=Len(szBuffer)
'開啟註冊鍵
RegOpenKeyExhKey,lpszSubKey,0,1,phkResult
'查詢結果
lResult=RegQueryValueEx(phkResult,szKey,0,0,szBuffer,lBuffSize)
'關閉註冊鍵
RegCloseKeyphkResult
'回傳結果
IflResult=ERROR_SUCCESSThen
GetRegValue=Left(szBuffer,lBuffSize-1)
Else
GetRegValue=""
EndIf
ExitFunction
ErrorRoutineErr:
GetRegValue=""
EndFunction
以上程序在WIN98,VB6.0下調試通過。 ->