📄 172.htm
字号:
<p>利用RAS调用在VB6.0中实现拨号上网</p>
<p></p>
<p>我们常用的软件如:JETCAR(现在为FLASHGET),GO!ZILLA等都具有拨号上网功能。那么,如何在自己编写的应用程序中也实现上述的功能呢?本文就利用RAS调用介绍在自己编写的应用程序如何实现拨号上网。</p>
<p></p>
<p> 一.与拨号网络有关的结构和函数</p>
<p></p>
<p> 1.RASDIALPARAMS95结构.其定义如下:</p>
<p></p>
<p>Public Type RASDIALPARAMS95</p>
<p> dwSize As Long</p>
<p> szEntryName(RAS95_MaxEntryName) As Byte</p>
<p> szPhoneNumber(RAS95_MaxPhoneNumber) As Byte</p>
<p> szCallbackNumber(RAS95_MaxCallbackNumber) As Byte</p>
<p> szUserName(UNLEN) As Byte</p>
<p> szPassword(PWLEN) As Byte</p>
<p> szDomain(DNLEN) As Byte</p>
<p>End Type </p>
<p></p>
<p> 其中,dwSize表示该结构的大小(以字节为单位)。szEntryName表示一个远程访问的入口名,也就是WINDOWS下的拨号网络中的连接图标小的文字;szEntryName参数可是是空串,表示仅与第一个有效的MODEM建立远程连接。szPhoneNumber为表示呼叫的号码。当szEntryName是空时,zPhoneNumber不能为空。szCallbackNumber表示回叫号码,一般都设为空。szUserName为建立远程访问的用户名。szPassword为建立远程访问的密码。szDomain为进行远程访问用户名和密码认证的域名。我们将szDomain设为空,表示远程访问的服务器也是该域名下的成员。</p>
<p></p>
<p> 2.RASDIAL函数.其API声明为:</p>
<p></p>
<p>Public Declare Function RasDial Lib "RasApi32.DLL" Alias "RasDialA" (lpRasDialExtensions As Any, ByVal lpszPhonebook As String, lprasdialparams As Any, ByVal dwNotifierType As Long, lpvNotifier As Long, lphRasConn As Long) As Long </p>
<p></p>
<p> RASDIAL函数用于建立RAS客户机和RAS服务器的连接。</p>
<p></p>
<p> 各参数解释如下:</p>
<p></p>
<p> lpRasDialExtensions参数在WINDOWS95/98下被忽略。</p>
<p></p>
<p> lpszPhonebook参数在WINDOWS95/98下也被忽略。</p>
<p></p>
<p> lprasdialparams参数是指向一个含有RAS连接参数值的RASDIALPARAMS结构变量。</p>
<p></p>
<p> dwNotifierType参数用于指出参数lpvNotifier的性质。若lpvNotifier 为NULL,则dwNotifierType的值被忽略;若lpvNotifier不为NULL,则dwNotifierType应该为下列值之一:</p>
<p></p>
<p> (1).0XFFFFFFFF------指出lpvNotifier参数是一个接收进程通知消息的窗口句柄;</p>
<p></p>
<p> (2).0----------------指出lpvNotifier指向一个RASDIALFUNC回调函数;</p>
<p></p>
<p> (3).1----------------指出lpvNotifier指向下一个RASDIALFUNC1回调函数。</p>
<p></p>
<p> lpvNotifier参数用于指向一个接收RASDIAL事件通知的窗口或者回调函数,其性质由dwNotifierType参数决定:</p>
<p></p>
<p> (1).若lpvNotifier不NULL,表示是异步通信。即RASDIAL会对每个事件发送一个窗口消息或者调用回调函数。RASDIAL函数会立即返回,它通过窗口或者调用回调函数建立连接,与进程通信。</p>
<p></p>
<p> (2).若lpvNotifier是NULL,表示同步通信。即RASDIAL函数在连接建立完成或者失败后才会返回。</p>
<p></p>
<p> lphRasConn参数指向HRASCONN变量,必须先将lphRasConn设置为NULL,然后再调用RASDIAL函数。如果RASDIAL函数调用成功,lphRasconn会放置一个RAS连接句柄。</p>
<p></p>
<p> 3.RASHANGUP函数.其API声明为:</p>
<p></p>
<p>Public Declare Function RasHangUp Lib "RasApi32.DLL" Alias "RasHangUpA" (ByVal hRasConn As Long) As Long </p>
<p></p>
<p> RASHANGUP函数用于断开一个RAS连接。其参数hRasConn为指向一个RAS连接的句柄。</p>
<p></p>
<p> 二.用VB6.0实现RAS拨号上网过程。</p>
<p></p>
<p> 新建一个工程,取名为RasDial;然后在该工程中加入如下项目:</p>
<p></p>
<p> 1.新建一个窗体Form1,然后在该窗体中加入如下组件:</p>
<p></p>
<p></p>
<p></p>
<p> ("连接"按钮取名为Ras_Dial,"挂断"按钮取名为:Ras_HangUp,"退出"按钮取名为:"Cancel".</p>
<p></p>
<p> 3个文本框分别取名为:PhoneNumber,UserName,PassWord.)</p>
<p></p>
<p></p>
<p></p>
<p></p>
<p> 2.双击连接按钮,加入如下代码:</p>
<p></p>
<p>Private Sub Ras_Dial_Click()</p>
<p>Dim temp As Long</p>
<p>If PhoneNumber.Text = "" Or UserName.Text = "" Or PassWord.Text = "" Then</p>
<p>temp = MsgBox("您没有输入有效的拨号网络参数。", vbOKOnly, "错误")</p>
<p>Exit Sub</p>
<p>End If</p>
<p>temp = AddConnection("", PhoneNumber.Text, "", UserName.Text, PassWord.Text, "")</p>
<p>Select Case temp</p>
<p>Case ERROR_PORT_ALREADY_OPEN: temp = MsgBox("错误,端口已经打开!", vbOKOnly, "Error")</p>
<p>Case ERROR_UNKNOWN: temp = MsgBox("未知的错误!", vbOKOnly, "Error")</p>
<p>Case ERROR_REQUEST_TIMEOUT: temp = MsgBox("错误,请求超时!", vbOKOnly, "Error")</p>
<p>Case ERROR_PASSWD_EXPIRED: temp = MsgBox("错误,您没有输入密码!", vbOKOnly, "Error")</p>
<p>Case ERROR_NO_DIALIN_PERMISSION: temp = MsgBox("错误,没有拨号音!", vbOKOnly, "Error")</p>
<p>Case ERROR_SERVER_NOT_RESPONDING: temp = MsgBox("错误,拨入的远程计算机没有响应!", vbOKOnly, "Error")</p>
<p>Case ERROR_UNRECOGNIZED_RESPONSE: temp = MsgBox("错误,未知的响应!", vbOKOnly, "Error")</p>
<p>Case ERROR_NO_RESPONSES: temp = MsgBox("错误,没有响应!", vbOKOnly, "Error")</p>
<p>Case ERROR_DEVICE_NOT_READY: temp = MsgBox("错误,设备没有准备好!", vbOKOnly, "Error")</p>
<p>Case ERROR_LINE_BUSY: temp = MsgBox("错误,占线!", vbOKOnly, "Error")</p>
<p>Case ERROR_NO_ANSWER: temp = MsgBox("错误,没有应答信号!", vbOKOnly, "Error")</p>
<p>Case ERROR_NO_CARRIER: temp = MsgBox("错误,没有载波信号!", vbOKOnly, "Error")</p>
<p>Case ERROR_NO_DIALTONE: temp = MsgBox("错误,没有拨号音!", vbOKOnly, "Error")</p>
<p>Case ERROR_AUTHENTICATION_FAILURE: temp = MsgBox("用户名密码出错!", vbOKOnly, "Error")</p>
<p>Case ERROR_PPP_TIMEOUT: temp = MsgBox("PPP接入超时。", vbOKOnly, "Error")</p>
<p>End Select</p>
<p>End Sub</p>
<p>3.双击挂断按钮,加入如下代码:</p>
<p>Private Sub Ras_HangUp_Click()</p>
<p>Dim temp As Long</p>
<p>temp = RasHangUp(hRasConn)</p>
<p>End Sub</p>
<p>4.双击退出按钮,加入如下代码:</p>
<p>Private Sub Cancel_Click()</p>
<p>Unload Me</p>
<p>End Sub</p>
<p>5.最后,新建一个模块,取名为Ras_Dial,加入如下代码:</p>
<p>Option Explicit</p>
<p>Public hRasConn As Long 注释:定义一个指向RAS调用的全局句柄</p>
<p>Public Const APINULL = 0&</p>
<p>Public Const UNLEN = 256</p>
<p>Public Const DNLEN = 15</p>
<p>Public Const PWLEN = 256</p>
<p>Public Const RAS95_MaxPhoneNumber = 128</p>
<p>Public Const RAS95_MaxEntryName = 256</p>
<p>Public Const RAS95_MaxCallbackNumber = RAS95_MaxPhoneNumber</p>
<p>Public Type RASDIALPARAMS95</p>
<p>dwSize As Long</p>
<p>szEntryName(RAS95_MaxEntryName) As Byte</p>
<p>szPhoneNumber(RAS95_MaxPhoneNumber) As Byte</p>
<p>szCallbackNumber(RAS95_MaxCallbackNumber) As Byte</p>
<p>szUserName(UNLEN) As Byte</p>
<p>szPassword(PWLEN) As Byte</p>
<p>szDomain(DNLEN) As Byte</p>
<p>End Type</p>
<p>注释:**********************************</p>
<p>注释:* RAS调用错误代号 *</p>
<p>注释:**********************************</p>
<p>Public Const NOT_SUPPORTED = 120&</p>
<p>Public Const RASBASEERROR = 600&</p>
<p>Public Const SUCCESS = 0&</p>
<p>Public Const ERROR_PORT_ALREADY_OPEN = (RASBASEERROR + 2)</p>
<p>Public Const ERROR_UNKNOWN = (RASBASEERROR + 35)</p>
<p>Public Const ERROR_REQUEST_TIMEOUT = (RASBASEERROR + 38)</p>
<p>Public Const ERROR_PASSWD_EXPIRED = (RASBASEERROR + 48)</p>
<p>Public Const ERROR_NO_DIALIN_PERMISSION = (RASBASEERROR + 49)</p>
<p>Public Const ERROR_SERVER_NOT_RESPONDING = (RASBASEERROR + 50)</p>
<p>Public Const ERROR_UNRECOGNIZED_RESPONSE = (RASBASEERROR + 52)</p>
<p>Public Const ERROR_NO_RESPONSES = (RASBASEERROR + 60)</p>
<p>Public Const ERROR_DEVICE_NOT_READY = (RASBASEERROR + 66)</p>
<p>Public Const ERROR_LINE_BUSY = (RASBASEERROR + 76)</p>
<p>Public Const ERROR_NO_ANSWER = (RASBASEERROR + 78)</p>
<p>Public Const ERROR_NO_CARRIER = (RASBASEERROR + 79)</p>
<p>Public Const ERROR_NO_DIALTONE = (RASBASEERROR + 80)</p>
<p>Public Const ERROR_AUTHENTICATION_FAILURE = (RASBASEERROR + 91)</p>
<p>Public Const ERROR_PPP_TIMEOUT = (RASBASEERROR + 118)</p>
<p>注释:**********************************</p>
<p>注释:* RAS API 声明 *</p>
<p>注释:**********************************</p>
<p>Public Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" (lpString1 As Any, ByVal lpString2 As String) As Long</p>
<p>Public Declare Function RasDial Lib "RasApi32.DLL" Alias "RasDialA" (lpRasDialExtensions As Any, ByVal lpszPhonebook As String, lprasdialparams As Any, ByVal dwNotifierType As Long, lpvNotifier As Long, lphRasConn As Long) As Long</p>
<p>Public Declare Function RasHangUp Lib "RasApi32.DLL" Alias "RasHangUpA" (ByVal hRasConn As Long) As Long </p>
<p>Public Function AddConnection(strNewEntryName As String, strNewPhoneNumber As String, strNewCallbackNumber As String, strNewUsername As String, strNewPassword As String, strNewDomain As String) As Integer</p>
<p></p>
<p>Dim lngRetCode As Long</p>
<p>Dim lngRetLstrcpy As Long</p>
<p>Dim lngRetHangUp As Long</p>
<p>Dim lprasdialparams As RASDIALPARAMS95</p>
<p>lprasdialparams.dwSize = 1052 注释:在WINDOWS95/98中必须将dwSize设为1052</p>
<p>注释:利用lstrcpy函数将字符串拷贝到BYTE数组</p>
<p>lngRetLstrcpy = lstrcpy(lprasdialparams.szEntryName(0), strNewEntryName)</p>
<p>lngRetLstrcpy = lstrcpy(lprasdialparams.szPhoneNumber(0), strNewPhoneNumber)</p>
<p>lngRetLstrcpy = lstrcpy(lprasdialparams.szCallbackNumber(0), strNewCallbackNumber)</p>
<p>lngRetLstrcpy = lstrcpy(lprasdialparams.szUserName(0), strNewUsername)</p>
<p>lngRetLstrcpy = lstrcpy(lprasdialparams.szPassword(0), strNewPassword)</p>
<p>lngRetLstrcpy = lstrcpy(lprasdialparams.szDomain(0), strNewDomain)</p>
<p>注释:我们使用同步通信</p>
<p>Screen.MousePointer = vbHourglass</p>
<p>hRasConn = 0 注释:</p>
<p>lngRetCode = RasDial(ByVal APINULL, vbNullString, lprasdialparams, APINULL, ByVal APINULL, hRasConn)</p>
<p>Screen.MousePointer = vbDefault</p>
<p>注释:测试有没有错误</p>
<p>If lngRetCode Then</p>
<p>lngRetHangUp = RasHangUp(hRasConn)</p>
<p>End If</p>
<p>AddConnection = lngRetCode</p>
<p>End Function</p>
<p>Public Sub RemoveConnection(H_RasConn As Long)</p>
<p>Call RasHangUp(hRasConn)</p>
<p>End Sub </p>
<p></p>
<p> 6.最后,编译生成应用程序,我们就实现了在自己的应用程序中拨号上网。本程序在PWIN98,VB6.0环境下编译通过。 </p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -