📄 20.htm
字号:
<p>程序中如何启动默认的拨号连接?</p>
<p> </p>
<p></p>
<p>栾金奎</p>
<p></p>
<p> 随着因特网的迅猛发展,现在编程常需要在程序中直接联网来处理一些事项,如在线注册和在线帮助,这就要求我们要在程序中建立某些连接。很多软件在不知用户是否联网的情况下不管三七二十一就启动浏览器查找网址,费了九牛二虎之力只能查出一错误页来(当然不可能有什么好的结果)。如果我们在程序编写时能自动判断用户是否已经联网,如已经联网则打开联接,如没有则启动默认的拨号连接,这样是不是让人觉得你的软件更胜人一处呢?判断是否已联网很多地方都有介绍,这里我们只介绍如何启动默认的拨号连接。</p>
<p> 在介绍之前让我们首先看看如何打开拨号网络。由于拨号网络不是一个可执行文件,所以不能用 “Shell 可执行文件”的方式来打开。要启动拨号网络,需借助 Explorer ,方法如下:</p>
<p></p>
<p> Shell "Explorer ::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\" & _</p>
<p> "::{992CFFA0-F557-101A-88EC-00DD010CCC48}", vbNormalFocus</p>
<p></p>
<p> 但若是要启动拨号网络中的某一个连接,则需借助rundll.exe 及 rnaui.dll 来启动,方法如下(假定连接名称为163):</p>
<p></p>
<p> Shell "rundll rnaui.dll,RnaDial 163", vbNormalFocus</p>
<p></p>
<p> 说明:在以上叙述中,“,RnaDial 163”这部分不要插入额外的空格,大小写也不要任意更改。</p>
<p></p>
<p> 上面仅仅假定了连接名称,但实际编程中我们是不知道其名称的,如何取得默认的连接名称并启动它呢?这里我们可利用注册表来达到目的。完整程序如下:</p>
<p></p>
<p> 在窗体上放置一个命令按钮(名称为 cmdCallConnect),下面为代码部份:</p>
<p></p>
<p>Option Explicit</p>
<p></p>
<p>'有关注册的API声明</p>
<p>Private Declare Function RegOpenKeyEx Lib "advapi32" Alias _</p>
<p> "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, _</p>
<p> ByVal ulOptions As Long, ByVal samDesired As Long, _</p>
<p> phkResult As Long) As Long</p>
<p>Private Declare Function RegQueryValueEx Lib "advapi32" Alias _</p>
<p> "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, _</p>
<p> ByVal lpReserved As Long, ByRef lpType As Long, ByVal szData As _</p>
<p> String, ByRef lpcbData As Long) As Long</p>
<p>Private Declare Function RegCloseKey Lib "advapi32" _</p>
<p> (ByVal hKey As Long) As Long</p>
<p>'常数</p>
<p>Const HKEY_CURRENT_USER = &H80000001</p>
<p>Const ERROR_SUCCESS = 0&</p>
<p></p>
<p>Private Sub cmdCallConnect_Click()</p>
<p> '启动默认拨号连接</p>
<p> Shell "rundll rnaui.dll,RnaDial " + GetConnect, vbNormalFocus</p>
<p>End Sub</p>
<p></p>
<p>Public Function GetConnect() As String</p>
<p> Dim hKey As Long</p>
<p> Dim SubKey As String</p>
<p> hKey = HKEY_CURRENT_USER '主键</p>
<p> SubKey = "RemoteAccess" '子键</p>
<p> '取得默认连接名</p>
<p> GetConnect = GetRegValue(hKey, SubKey, "Default")</p>
<p>End Function</p>
<p></p>
<p>Public Function GetRegValue(hKey As Long, lpszSubKey As String, _</p>
<p>szKey As String) As Variant</p>
<p></p>
<p> On Error GoTo ErrorRoutineErr:</p>
<p></p>
<p> Dim phkResult As Long</p>
<p> Dim lResult As Long</p>
<p> Dim szBuffer As String</p>
<p> Dim lBuffSize As Long</p>
<p></p>
<p> '创建缓冲区</p>
<p> szBuffer = Space(255)</p>
<p> lBuffSize = Len(szBuffer)</p>
<p></p>
<p> '打开注册键</p>
<p> RegOpenKeyEx hKey, lpszSubKey, 0, 1, phkResult</p>
<p></p>
<p> '查询结果</p>
<p> lResult = RegQueryValueEx(phkResult, szKey, 0, 0, szBuffer, lBuffSize)</p>
<p></p>
<p> '关闭注册键</p>
<p> RegCloseKey phkResult</p>
<p></p>
<p> '返回结果</p>
<p> If lResult = ERROR_SUCCESS Then</p>
<p> GetRegValue = Left(szBuffer, lBuffSize - 1)</p>
<p> Else</p>
<p> GetRegValue = ""</p>
<p> End If</p>
<p> Exit Function</p>
<p></p>
<p>ErrorRoutineErr:</p>
<p> GetRegValue = ""</p>
<p>End Function</p>
<p></p>
<p> </p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -