转贴<br>用MODEM拨号上网,仍是大多数个人网民选择上网的方式.如果<br>能在我们的应用程序中管理拨号<br>网络(如Foxmail、Sygate中的拨号功能),无疑将会方便我们的软<br>件用户(不用再切换应用程序,<br>运行拨号网络),提高我们的软件的友好性从而提高软件的竞争<br>力.<br> 在WIN9X下,如果安装了拨号网络,则在WINDOWS系统的系统目<br>录System下将有两个拨号网络管理<br>程序库RasApi32.DLL和RasApi16.DLL,我们可利用其中的函数来获<br>取和设置拨号连接网络的信息。在<br>Delphi帮助文件中,有相关函数的说明。<br><br> 在此,我们要讨论的管理项目有:<br>1、获取当前系统中可用的拨号连接名称<br> 2、新建拨号连接、修改拨号连接的属性<br> 3、获取和设置拨号连接的拨号参数<br> 4、用指定的拨号连接拨号、挂断指定的拨号连接<br> 5、获取当前活动的连接及其连接状态<br><br>零、获取RasAPI函数执行失败的错误信息<br> RasAPI的调用接口是统一的,但对于不同的Windows版本,许多<br>常量和数据结构的定义是不同的。<br>如果使用的数据结构与Windows版本不对应,RasAPI函数执行会失<br>败;另外,其它原因如其它程序也<br>在使用同一个拨号连接进行拨号等,也会造成RasAPI函数执行失<br>败.鉴于此原因,我们需要先讨论获<br>取RasAPI函数执行失败的错误信息的函数。<br> 当一个RasAPI函数执行结束时,会返回一个结果标识,为0时表<br>示执行成功,否则作为一个错误标<br>识符表示执行失败的原因。RasAPI函数RasGetErrorString可以根据<br>错误标识符返回其错误描述信息,<br>在中文WIN9X下可提供一个中文错误信息.<br> RasGetErrorString的函数原型为:<br>function RasGetErrorString (<br>uErrorValue : UINT;//错误标识符<br>lpszErrorString : PChar;//错误提示信息的缓冲区<br>cBufSize : DWORD//错误提示信息的缓冲区大小<br>) : DWORD; stdcall;<br>function RasGetErrorString;external RasApiDll name <br>'RasGetErrorStringA';<br>( 注:RasApiDll = 'Rasapi32.dll'; )<br><br> 为了方便,我们可以自己编写一个函数,用于获取RasAPI函数<br>执行失败的错误信息。在下面的例<br>子中,会经常用到该函数。函数代码如下所示:<br>{ 根据错误标识符,获取RasAPI函数执行失败的错误信息 }<br>function GetRasError( ErrorID : UINT ) : string;<br>var<br>buffer : array[ 0..255 ] of char;<br>begin<br>if 0 = RasGetErrorString( ErrorID, buffer, 256 ) then<br>result := strpas( buffer )//如果能正确返回错误信息,则转化<br>为Pascal字符串<br>else//否则返回16进制形式的错误代码<br>result := 'GetRasError Failure:ErrorID=' + Format( <br>'%x',[ErrorID] );<br>end;<br><br>一、获取当前系统中可用的拨号连接名称<br> 即获取系统中已建立的拨号连接的名称,可用来让用户选择使<br>用哪个拨号连接进行拨号.<br> 可以用两种方法来实现.一种是利用RasAPI函数;另一种是不<br>用RasAPI函数,直接在注册表中查询.<br><br> 1、不用RasAPI函数,直接在注册表中查询<br> 在注册表的<br>HKEY_USERS/.Default/RemoteAccess/Addresses下,列出了已经在<br>拨号网络中建立<br> 了的拨号连接的名称及其属性设置,其中各项目的名称即为可<br>用的拨号连接的名称;各项目的值即<br> 为各拨号连接的属性设置,不过是二进制串,笔者还看不<br>懂.由此可见,我们只要读出各项目的名<br> 称即可获取当前系统中可用的拨号连接名称.<br>var<br>registryTemp : TRegistry;<br>stringsTemp : TStringlist;<br>begin<br>registryTemp := TRegistry.Create;<br>stringsTemp := TStringlist.Create;<br>with registryTemp do<br>begin<br>RootKey := HKEY_USERS;//根键设置为HKEY_USERS<br>//如果存在子键.Default/RemoteAccess/Addresses<br>if OpenKey('.Default/RemoteAccess/Addresses',false) then<br>GetValueNames( stringsTemp );//读出各项目的名称,即拨号连接<br>名称<br>end;<br>combobox1.Items.assign( stringsTemp );//显示,供选择<br>end;<br><br> 2、用RasAPI函数<br>RasAPI函数RasEnumEntries可获取当前系统中可用的拨号连接名<br>称.其函数原型为<br>function RasEnumEntries(<br>reserved : PChar;//保留字段,必须为NIL<br>lpszPhonebook : PChar;//电话本名称,在Win9X下无作用,可为空字<br>符串<br>lprasentryname : LPRASENTRYNAME;//接收拨号连接名称的缓冲区,<br>是一个RASENTRYNAME类型数组的指针<br>var lpcb : DWORD;//接收拨号连接名称的缓冲区的大小(Bytes)<br>var lpcEntries: DWORD//实际获得的拨号连接名称的数目<br>) : DWORD; stdcall;<br>function RasEnumEntries;external RasApiDll name <br>'RasEnumEntriesA';<br><br>参数lprasentryname提供了一个RASENTRYNAME类型数组的指针,指<br>向一个接收拨号连接名称的缓冲<br> 区,其中RASENTRYNAME及LPRASENTRYNAME的类型说明如下:<br><br>LPRASENTRYNAME = ^RASENTRYNAME;<br>RASENTRYNAME = record<br>dwSize : DWORD;//该结构所占内存的大小(Bytes),一般设置为<br>SizeOf(RASENTRYNAME)<br>szEntryName : array [ 0..RAS_MaxEntryName ] of char;//拨号<br>连接名称<br>end;<br> lpcb为缓冲区的大小,一般设置为dwSize的倍数,倍数为<br>可能有的连接的个数.<br> lpcEntries实际的连接的个数.<br><br> 下面是一个应用例子,列出了当前系统中可用的拨号连接<br>名称.<br>注意,应在RASENTRYNAME缓冲区的第一个RASENTRYNAME结构中设置<br>dwSize.<br>const<br>MaxPhoneEntries = 10;//最多的拨号连接数目<br>var<br>intIndex : integer;<br>PhoneEntries : array[ 0..MaxPhoneEntries - 1 ] of <br>RASEntryName;<br>dwSize, dwEntries, dwResult : DWORD;<br>begin<br>//在RASENTRYNAME缓冲区的第一个RASENTRYNAME结构中设置dwSize<br>PhoneEntries[ 0 ].dwSize := sizeof( RASEntryName );<br><br>dwSize := MaxPhoneEntries * sizeof( RASEntryName );//为缓冲<br>区的大小<br>//调用RasAPI函数,获取当前系统中可用的拨号连接名称<br>dwResult := RasEnumEntries ( NIL,'',@PhoneEntries[ 0 <br>],dwSize, dwEntries );<br><br>if dwResult <> 0 then<br>begin//RasAPI函数,执行错误<br>memo1.lines.add('RasEnumEntries错误:' + GetRasError( <br>dwResult ));<br>exit;<br>end;<br><br>//显示当前系统中可用的拨号连接名称<br>memo1.lines.add('共有' + inttostr( dwEntries ) + '个RAS连<br>接,如下所示');<br>for intIndex := 0 to dwEntries -1 do<br>memo1.lines.add( strpas( PhoneEntries[ intIndex <br>].szEntryName ) );<br>end;<br><br> 3、获取默认的拨号连接的名称<br> 默认的拨号连接,即用户在浏览器中设置的拨号连接,该<br>连接可以认为是用户最常用<br> 的拨号连接.<br> 在注册表的HKEY_USERS/.Default/RemoteAccess位置,有<br>一个字符串名Profile,它对应<br> 字符值即为HKEY_USERS/.Default/RemoteAccess/Addresses.<br><br>二、新建拨号连接、修改拨号连接的属性<br> RasAPI函数RasCreatePhonebookEntry、<br>RasEditPhonebookEntry通过调用Win9X的<br>新建拨号连接、修改拨号连接的设置界面,允许用户新建拨号连<br>接、修改拨号连接,具体<br>的设置操作还要由系统来完成.<br> 1、新建拨号连接<br> 新建拨号连接的RasAPI函数为RasCreatePhonebookEntry,<br>其函数原型为:<br>function RasCreatePhonebookEntry(<br>hwnd : THandle; //新建拨号连接窗口的父窗口的句柄,为NIL表示<br>桌面(DeskTop)<br>lpszPhonebook: pchar//电话本名称,在Win9X下无作用,可为空字符<br>串<br>) : DWORD;stdcall;<br>function RasCreatePhonebookEntry;external RasApiDll name <br>'RasCreatePhonebookEntryA';<br><br> 函数返回值为0表示执行成功;否则为错误代码.<br><br> 下面是一个应用例子,允许用户新建一个拨号连接.<br>var<br>dwResult : DWORD;<br>begin<br>//在当前窗口中新建拨号连接<br>dwResult := RasCreatePhonebookEntry( handle, '' );<br>if dwResult = 0 then<br>memo1.lines.add('新建拨号连接成功!')<br>else<br>memo1.lines.add('新建拨号连接失败:!' + GetRasError( <br>dwResult ))<br>end;<br><br> 2、修改拨号连接的属性<br> 修改拨号连接的属性的RasAPI函数为<br>RasEditPhonebookEntry,其函数原型为:<br>function RasEditPhonebookEntry(<br>hwnd : THandle; //新建拨号连接窗口的父窗口的句柄,为NIL表示<br>桌面(DeskTop)<br>lpszPhonebook: pchar;//电话本名称,在Win9X下无作用,可为空字<br>符串<br>lpszEntryName: pchar//拨号连接的名称,如'163'、'169'等<br>) : DWORD; stdcall;<br>function RasEditPhonebookEntry;external RasApiDll name <br>'RasEditPhonebookEntryA';<br><br> 函数返回值为0表示执行成功;否则为错误代码.<br> 下面是一个应用例子,允许用户修改指定拨号连接的属<br>性.<br>var<br>dwResult : DWORD;<br>begin<br>//在当前窗口中修改拨号连接的属性<br>dwResult := RasEditPhonebookEntry( handle, '', '163' );<br>if dwResult = 0 then<br>memo1.lines.add('修改拨号连接成功!')<br>else<br>memo1.lines.add('修改拨号连接失败:!' + GetRasError( <br>dwResult ))<br>end;<br><br>三、获取和设置拨号连接的拨号参数<br> 用RasAPI函数RasGetEntryDialParams、<br>RasSetEntryDialParams可以直接获取和设置指定拨号<br>连接的拨号参数,其中包括用户名称和用户密码!<br> 1、获取拨号连接的拨号参数<br> 获取拨号连接的拨号参数RasAPI函数为<br>RasGetEntryDialParams,其函数原型为:<br>function RasGetEntryDialParams(<br>lpszPhonebook: pchar;//电话本名称,在Win9X下无作用,可为空字<br>符串<br>pRASDIALPARAMS:LPRASDIALPARAMS;//拨号参数,是一个<br>RASDIALPARAMS类型的指针<br>var lpfPassword : WordBool//是否需要用户密码<br>) : DWORD; stdcall;<br>function RasGetEntryDialParams;external RasApiDll name <br>'RasGetEntryDialParamsA';<br><br>参数pRASDIALPARAMS是一个RASDIALPARAMS类型的指针,指向一个拨<br>号连接的拨号参数数据<br>的缓冲区,其中RASDIALPARAMS及LPRASDIALPARAMS的类型说明如<br>下:<br>LPRASDIALPARAMS = ^RASDIALPARAMS;<br>RASDIALPARAMS = record<br>dwSize : DWORD;//该结构所占内存的大小(Bytes),一般设置为<br>SizeOf(RASDIALPARAMS)<br>szEntryName : array[0..RAS_MaxEntryName] of char;//拨号连接<br>名称<br>szPhoneNumber : array[0..RAS_MaxPhoneNumber] of char;//拨号<br>号码<br>szCallbackNumber : array[0..RAS_MaxCallbackNumber] of <br>char;//回叫号码<br>szUserName : array[0..UNLEN] of char;//用户名称<br>szPassword : array[0..PWLEN] of char;//用户密码<br>szDomain : array[0..DNLEN] of char;//域名<br>end;<br> 函数返回值为0表示执行成功;否则为错误代码.<br> 下面是一个应用例子,获取指定拨号连接的拨号参数.<br>var<br>dwResult : DWORD;<br>RASDIALPARAMSData : RASDIALPARAMS;<br>NeedPWD : WordBool;<br>begin<br>//指定拨号连接的名称<br>with RASDIALPARAMSData do<br>begin<br>dwSize := sizeof( RASDIALPARAMS );//结构大小<br>szEntryName := '163';//指定拨号连接的名称<br>szUserName := '';//其它五个参数初始化<br>szPassword := '';<br>szDomain := '';<br>szCallbackNumber := '';<br>szPhoneNumber := '';<br>end;<br>NeedPWD := true;//需要用户密码<br><br>//获取指定拨号连接的拨号参数<br>dwResult := RasGetEntryDialParams( <br>'',@RASDIALPARAMSData,NeedPWD );<br><br>if dwResult <> 0 then //获取指定拨号连接的拨号参数失败<br>memo1.lines.add( '获取<br>'+StrPAS(RASDIALPARAMSData.szEntryName )+'拨号参数失败:' <br>+ GetRasError( dwResult ))<br>else<br>begin//显示指定拨号连接的拨号参数<br>memo1.lines.add( StrPAS(RASDIALPARAMSData.szEntryName )+'拨<br>号参数如下');<br>memo1.lines.add( '用户名称:' + <br>StrPAS(RASDIALPARAMSData.szUserName ));<br>memo1.lines.add( '用户密码:' + <br>StrPAS(RASDIALPARAMSData.szPassword ));<br>memo1.lines.add( '域 名:' + <br>StrPAS(RASDIALPARAMSData.szDomain ));<br>memo1.lines.add( '回叫号码:' + <br>StrPAS(RASDIALPARAMSData.szCallbackNumber ));<br>memo1.lines.add( '拨号号码:' + <br>StrPAS(RASDIALPARAMSData.szPhoneNumber ));<br>end;<br>end;<br> 2、设置拨号连接的拨号参数<br> 设置拨号连接的拨号参数RasAPI函数为<br>RasSetEntryDialParams,其函数原型为:<br>function RasSetEntryDialParams(<br>lpszPhonebook: pchar;//电话本名称,在Win9X下无作用,可为空字<br>符串<br>pRASDIALPARAMS:LPRASDIALPARAMS;//拨号参数,是一个<br>RASDIALPARAMS类型的指针<br>var lpfPassword : WordBool//是否删除用户密码<br>) : DWORD; stdcall;<br>function RasSetEntryDialParams;external RasApiDll name <br>'RasSetEntryDialParamsA';<br>参数pRASDIALPARAMS的说明同RasGetEntryDialParams.<br>参数lpfPassword的含义与RasGetEntryDialParams不同,在此表示<br>是否删除用户密码,为<br> TRUE时将原来的用户密码删除.<br> <br> 函数返回值为0表示执行成功;否则为错误代码.<br> 下面是一个应用例子,设置指定拨号连接的拨号参数.<br>var<br>dwResult : DWORD;<br>RASDIALPARAMSData : RASDIALPARAMS;<br>RemovePWD : WordBool;<br>begin<br>//指定拨号连接的拨号参数<br>with RASDIALPARAMSData do<br>begin<br>dwSize := sizeof( RASDIALPARAMS );//结构大小<br>szEntryName := '163';//指定拨号连接的名称<br>szUserName := 'MyName';//指定用户名称<br>szPassword := 'MyPassword';//指定用户密码<br>szDomain := 'MyDomain';//指定域名<br>szCallbackNumber := '';//指定回叫号码<br>szPhoneNumber := '';//指定拨号号码<br>end;<br>RemovePWD := false;//不需要删除用户密码<br><br>//设置指定拨号连接的拨号参数<br>dwResult := RasSetEntryDialParams( <br>'',@RASDIALPARAMSData,RemovePWD );<br><br>if dwResult <> 0 then //设置指定拨号连接的拨号参数失败<br>memo1.lines.add( '设置<br>'+StrPAS(RASDIALPARAMSData.szEntryName )+'拨号参数失败:' <br>+ GetRasError( dwResult ))<br>else<br>begin//显示指定拨号连接的拨号参数<br>memo1.lines.add( StrPAS(RASDIALPARAMSData.szEntryName )+'拨<br>号参数设置成功');<br>memo1.lines.add( '用户名称:' + <br>StrPAS(RASDIALPARAMSData.szUserName ));<br>memo1.lines.add( '用户密码:' + <br>StrPAS(RASDIALPARAMSData.szPassword ));<br>memo1.lines.add( '域 名:' + <br>StrPAS(RASDIALPARAMSData.szDomain ));<br>memo1.lines.add( '回叫号码:' + <br>StrPAS(RASDIALPARAMSData.szCallbackNumber ));<br>memo1.lines.add( '拨号号码:' + <br>StrPAS(RASDIALPARAMSData.szPhoneNumber ));<br>end;<br>end;<br><br>四、用指定的拨号连接拨号、挂断指定的拨号连接<br> 1、用指定的拨号连接拨号<br> 拨号有两种方法,一种是调用拨号网络中的拨号程序,就<br>象用户自己用鼠标双击拨号连接名称一<br> 样,用户可以修改拨号号码、用户名称和用户密码,最后由拨<br>号网络来完成拨号过程;另一个方法则<br> 是调用RasAPI函数.<br>(1)用拨号网络中的拨号程序<br> 在程序中可以用如下代码:<br> winexec('rundll32.exe rnaui.dll,RnaDial 169',<br>SW_SHOWNORMAL);<br> 其中字符串中的最后一个参数“169”为拨号连接的<br>名称。<br>(2)用RasAPI函数拨号<br> 用拨号连接拨号的RasAPI函数为RasDial,其函数原型为:<br>function RasDial(<br>pRasDialExtensions : LPRASDIALEXTENSIONS;//在WIN9X下无用,可<br>设置为NIL<br>lpszPhonebook : PChar;//电话本名称,在Win9X下无作用,可为空<br>字符串<br>lpRasDialParams : LPRASDIALPARAMS;//拨号参数<br>dwNotifierType : DWORD;//消息通知方式<br>handle : TRasDialFunc;//消息处理事件<br>var lphRasConn : DWORD//返回的成功连接的连接句柄<br>) : DWORD; stdcall;<br>function RasDial;external RasApiDll name 'RasDialA';<br><br> 参数pRASDIALPARAMS的说明同RasGetEntryDialParams.<br> 参数dwNotifierType表示消息通知方式.在拨号过程中,<br>系统发出拨号事件消息可以通知拨号<br> 进度,因而需要提供接受消息的方式和处理消息的函数.当其<br>值为$FFFFFFFF时,则参数handle被<br> 视为一个窗口的句柄,事件消息被发生该窗口处理;当其值为0<br>时,handle被视为TRasDialFunc类型<br> 的函数的指针;当其值为1时,handle被视为TRasDialFunc1类<br>型的函数的指针.<br> 参数handle表示消息处理函数指针,其类型可以THandle、<br>TRasDialFunc、TRasDialFunc1.当该<br> 参数不为NULL或NIL时,其代表的消息处理函数指针将接受拨号<br>进度通知消息;为NIL时,拨号过程由<br> 异步方式变为同步方式,直到拨号过程成功或失败后RasDial函<br>数才返回.详细可参见Delphi帮助文件<br> 中关于RasDial函数的帮助。<br> 当拨号连接成功时,lphRasConn将表示其连接句柄.<br><br> 函数返回值为0表示执行成功;否则为错误代码.<br> 下面是一个应用例子,按指定的拨号参数拨号.<br><br>var<br>RASDIALPARAMSData : RASDIALPARAMS;<br>dwResult : DWord;<br>RasCon : DWord;<br>begin<br>//指定拨号连接的拨号参数<br>with RASDIALPARAMSData do<br>begin<br>dwSize := sizeof( RASDIALPARAMS );//结构大小<br>szEntryName := '163';//指定拨号连接的名称<br>szUserName := 'MyName';//指定用户名称<br>szPassword := 'MyPassword';//指定用户密码<br>szDomain := 'MyDomain';//指定域名<br>szCallbackNumber := '';//指定回叫号码<br>szPhoneNumber := '';//指定拨号号码<br>end;<br><br>//用指定的拨号参数拨号,采用同步拨号方式<br>dwResult := RasDial( NIL,'',@RASDIALPARAMSData,0,NIL,RasCon <br>);<br><br>if dwResult <> 0 then //设置指定拨号连接的拨号参数失败<br>memo1.lines.add( '用'+StrPAS(RASDIALPARAMSData.szEntryName <br>)+'拨号失败:' <br>+ GetRasError( dwResult ))<br>else<br>memo1.lines.add( '用'+StrPAS(RASDIALPARAMSData.szEntryName <br>)+'拨号成功!' );<br>end;<br><br> 2、挂断指定的拨号连接<br> 挂断拨号连接的RasAPI函数为RasHangUp,其函数原型为:<br>function RasHangUp(<br>hRasConn : DWORD//要挂断的拨号连接的句柄<br>) : DWORD; stdcall;<br>function RasHangUp;external RasApiDll name 'RasHangUpA';<br> 函数返回值为0表示执行成功;否则为错误代码.<br> 下面是一个应用例子,挂断由RasDial建立的拨号连接.<br><br>//挂断由RasDial建立的拨号连接<br>dwResult := RasHangUp( RasCon );<br>if dwResult <> 0 then //挂断失败<br>memo1.lines.add( '挂断失败:' + GetRasError( dwResult ))<br>else<br>memo1.lines.add( '挂断成功!'); <br><br>五、获取当前活动的连接及其连接状态<br> 1、获取当前活动的连接<br> 获取当前活动的连接的RasAPI函数为<br>RasEnumConnections,其函数原型为:<br>function RasEnumConnections( var lprasconn : RASCONN ;//接<br>收活动连接的缓冲区的指针<br>var lpcb: DWORD;//缓冲区大小<br>var lpcConnections : DWORD//实际的活动连接数<br>) : DWORD; stdcall;<br>function RasEnumConnections;external RasApiDll name <br>'RasEnumConnectionsA';<br>参数lprasconn提供了一个RASCONN类型数组的指针,指向一个接收<br>活动连接的缓冲<br> 区,其中RASCONN的类型说明如下:<br>RASCONN = record<br>dwSize : DWORD;//该结构所占内存的大小(Bytes),一般设置为<br>SizeOf(RASCONN)<br>hrasconn : HRASCONN;//活动连接的句柄<br>szEntryName : array[0..RAS_MaxEntryName] of char;//活动连接<br>的名称<br>szDeviceType : array[0..RAS_MaxDeviceType] of char;//活动连<br>接的所用的设备类型<br>szDeviceName : array[0..RAS_MaxDeviceName] of char;//活动连<br>接的所用的设备名称<br>end;<br> 参数lpcb为缓冲区大小(Bytes).<br> 参数lpcConnections将返回实际的连接数目.<br><br> 函数返回值为0表示执行成功;否则为错误代码.<br><br> 2、获取指定连接的连接状态<br> 获取指定连接的连接状态的RasAPI函数为<br>RasGetConnectStatus,其函数原型为:<br>function RasGetConnectStatus(<br>hrasconn : HRASCONN; //指定活动连接的句柄<br>lprasconnstatus : LPRASCONNSTATUS//连接状态参数<br>) : DWORD; stdcall;<br>function RasGetConnectStatus;external RasApiDll name <br>'RasGetConnectStatusA';<br> 连接状态参数lprasconnstatus是一个RASCONNSTATUS类型<br>的指针,将返回连接状态参数.<br> RASCONNSTATUS和LPRASCONNSTATUS的类型说明如下:<br>LPRASCONNSTATUS = ^RASCONNSTATUS;<br>RASCONNSTATUS = record<br>dwSize : DWORD;//该结构所占内存的大小(Bytes),一般设置为<br>SizeOf(RASCONNSTATUS)<br>rasconnstate : RASCONNSTATE;//连接状态标识,一组DWORD类型数<br>值的集合。<br>dwError : DWORD;//错误类型标识符<br>szDeviceType : array[0..RAS_MaxDeviceType] of char;//活动连<br>接的所用的设备类型<br>szDeviceName : array[0..RAS_MaxDeviceName] of char;//活动连<br>接的所用的设备名称<br>end;<br> 函数返回值为0表示执行成功;否则为错误代码.<br><br> 下面是一个应用例子,列出了当前系统中活动的连接的名<br>称及其连接状态.<br>注意,应在RASCONN缓冲区的第一个RASCONN结构中设置dwSize.<br><br>const<br>MaxConnections = 10;//最多的拨号连接数目<br>var<br>connections : array[0..MaxConnections-1] of RASCONN;<br>longSize : dword;<br>intAvailabelConnections : dword;<br>intIndex : integer;<br>dwResult : DWORD;<br>strTemp : string;<br>RASCONNSTATUSData : RASCONNSTATUS; <br>begin<br>connections[ 0 ].dwSize := sizeof(RASCONN);//结构的大小<br>longSize := MaxConnections * connections[ 0 ].dwSize;//缓冲<br>区大小<br>intAvailabelConnections := 0;//实际的活动连接的数目<br>//获取当前系统中活动的连接<br>dwResult := RasEnumConnections( connections[ 0 ], longSize,<br>intAvailabelConnections );<br>if dwResult <> 0 then //获取当前系统中活动的连接<br>memo1.lines.add( '获取当前系统中活动的连接:' + <br>GetRasError( dwResult ))<br>else<br>begin<br>memo1.lines.add( '当前系统中活动的连接' + inttostr( <br>intAvailabelConnections ) <br>+ '个,列举如下' );<br>for intIndex := 0 to intAvailabelConnections - 1 do<br>begin<br>strTemp := '连接名称:' + StrPAS( connections[ intIndex <br>].szEntryName )<br>+ ' 设备类型:' + StrPAS( connections[ intIndex <br>].szDeviceType )<br>+ ' 设备名称:' + StrPAS( connections[ intIndex <br>].szDeviceName );<br>//获取连接状态<br>dwResult := RasGetConnectStatus( connections[ intIndex <br>].hRasConn,@RASCONNSTATUSData );<br>if 0 <> dwResult then<br>strTemp := strTemp + ' 连接状态未知:' + GetRasError( <br>dwResult )<br>else if RASCONNSTATUSData.rasconnstate = RASCS_Connected <br>then<br>strTemp := strTemp + ' 连接状态:已连接'<br>else<br>strTemp := strTemp + ' 连接状态
' + <br>inttostr(RASCONNSTATUSData.rasconnstate)+')';<br>memo1.lines.add( strTemp );<br>end;<br>end;<br>end;<br><br>以上程序在PWIN98+Delphi3.0下调试通过。<br>