用MODEM拨号上网,仍是大多数个人网民选择上网的方式.如果能在我们的应用程序中管理拨号 网络(如Foxmail、Sygate中的拨号功能),无疑将会方便我们的软件用户(不用再切换应用
程序, 运行拨号网络),提高我们的软件的友好性从而提高软件的竞争力.
在WIN9X下,如果安装了拨号网络,则在WINDOWS系统的系统目录System下将有两个拨号网络管理
程序库RasApi32.DLL和RasApi16.DLL,我们可利用其中的函数来获取和设置拨号连接网络的信息。在 Delphi帮助文件中,有相关函数的说明。
在此,我们要讨论的管理项目有:
1、获取当前系统中可用的拨号连接名称
2、新建拨号连接、修改拨号连接的属性
3、获取和设置拨号连接的拨号参数
4、用指定的拨号连接拨号、挂断指定的拨号连接
5、获取当前活动的连接及其连接状态零、获取RasAPI函数执行失败的错误信息
RasAPI的调用接口是统一的,但对于不同的Windows版本,许多常量和数据结构的定义是不同的。 如果使用的数据结构与Windows版本不对应,RasAPI函数执行会失败;另外,其它原因如其它
程序也 在使用同一个拨号连接进行拨号等,也会造成RasAPI函数执行失败.鉴于此原因,我们需要先讨论获 取RasAPI函数执行失败的错误信息的函数。
当一个RasAPI函数执行结束时,会返回一个结果标识,为0时表示执行成功,否则作为一个错误标 识符表示执行失败的原因。RasAPI函数RasGetErrorString可以根据错误标识符返回其错误描述信息,
在中文WIN9X下可提供一个中文错误信息.
RasGetErrorString的函数原型为:
function RasGetErrorString (
uErrorValue : UINT;//错误标识符
lpszErrorString : PChar;//错误提示信息的缓冲区
cBufSize : DWORD//错误提示信息的缓冲区大小
) : DWORD; stdcall;
function RasGetErrorString;external RasApiDll name ''RasGetErrorStringA'';
( 注:RasApiDll = ''Rasapi32.dll''; )
为了方便,我们可以自己编写一个函数,用于获取RasAPI函数执行失败的错误信息。在下面的例
子中,会经常用到该函数。函数代码如下所示:
{ 根据错误标识符,获取RasAPI函数执行失败的错误信息 }
function GetRasError( ErrorID : UINT ) : string;
var
buffer : array[ 0..255 ] of char;
begin
if 0 = RasGetErrorString( ErrorID
buffer
256 ) then
result := strpas( buffer )//如果能正确返回错误信息,则转化为Pascal字符串
else//否则返回16进制形式的错误代码
result := ''GetRasError Failure:ErrorID='' + Format( ''%x''
[ErrorID] );
end;
一、获取当前系统中可用的拨号连接名称
即获取系统中已建立的拨号连接的名称,可用来让用户选择使用哪个拨号连接进行拨号.
可以用两种方法来实现.一种是利用RasAPI函数;另一种是不用RasAPI函数,直接在
注册表中
查询.
1、不用RasAPI函数,直接在注册表中
查询在注册表的HKEY_USERS\.Default\RemoteAccess\Addresses下,列出了已经在拨号网络中建立的拨号连接的名称及其属性设置,其中各项目的名称即为可用的拨号连接的名称;各项目的值即为各拨号连接的属性设置,不过是二进制串,笔者还看不懂.由此可见,我们只要读出各项目的名称即可获取当前系统中可用的拨号连接名称.
var
registryTemp : TRegistry;
stringsTemp : TStringlist;
begin
registryTemp := TRegistry.Create;
stringsTemp := TStringlist.Create;
with registryTemp do
begin
RootKey := HKEY_USERS;//根键设置为HKEY_USERS
//如果存在子键.Default\RemoteAccess\Addresses
if OpenKey(''.Default\RemoteAccess\Addresses''
false) then
GetValueNames( stringsTemp );//读出各项目的名称,即拨号连接名称
end;
combobox1.Items.assign( stringsTemp );//显示,供选择
end;
2、用RasAPI函数