📄 在delphi程序管理拨号网络 (2000年8月21日).txt
字号:
在DELPHI程序管理拨号网络 (2000年8月21日)
本站更新 分类: 作者:深圳王发军 推荐: 阅读次数:824
(http://www.codesky.net)
--------------------------------------------------------------------------------
用MODEM拨号上网,仍是大多数个人网民选择上网的方式.如果能在我们的应用程序中管理拨号网络(如
Foxmail、Sygate中的拨号功能),无疑将会方便我们的软件用户(不用再切换应用程序,运行拨号网
络),提高我们的软件的友好性从而提高软件的竞争力.
在WIN9X下,如果安装了拨号网络,则在WINDOWS系统的系统目录System下将有两个拨号网络管理程序库
RasApi32.DLL和RasApi16.DLL,我们可利用其中的函数来获取和设置拨号连接网络的信息。在Delphi帮助
文件中,有相关函数的说明。
在此,我们要讨论的管理项目有:
1、获取当前系统中可用的拨号连接名称
2、新建拨号连接、修改拨号连接的属性
3、获取和设置拨号连接的拨号参数
4、用指定的拨号连接拨号、挂断指定的拨号连接
5、获取当前活动的连接及其连接状态
一、获取当前系统中可用的拨号连接名称
即获取系统中已建立的拨号连接的名称,可用来让用户选择使用哪个拨号连接进行拨号.
可以用两种方法来实现.一种是利用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函数
RasAPI函数RasEnumEntries可获取当前系统中可用的拨号连接名称.其函数原型为
function RasEnumEntries(
reserved : PChar;//保留字段,必须为NIL
lpszPhonebook : PChar;//电话本名称,在Win9X下无作用,可为空字符串
lprasentryname : LPRASENTRYNAME;//接收拨号连接名称的缓冲区,是一个RASENTRYNAME类型数组的指针
var lpcb : DWORD;//接收拨号连接名称的缓冲区的大小(Bytes)
var lpcEntries: DWORD//实际获得的拨号连接名称的数目
) : DWORD; stdcall;
function RasEnumEntries;external RasApiDll name 'RasEnumEntriesA';
参数lprasentryname提供了一个RASENTRYNAME类型数组的指针,指向一个接收拨号连接名称的缓冲
区,其中RASENTRYNAME及LPRASENTRYNAME的类型说明如下:
LPRASENTRYNAME = ^RASENTRYNAME;
RASENTRYNAME = record
dwSize : DWORD;//该结构所占内存的大小(Bytes),一般设置为SizeOf(RASENTRYNAME)
szEntryName : array [ 0..RAS_MaxEntryName ] of char;//拨号连接名称
end;
lpcb为缓冲区的大小,一般设置为dwSize的倍数,倍数为可能有的连接的个数.
lpcEntries实际的连接的个数.
下面是一个应用例子,列出了当前系统中可用的拨号连接名称.
注意,应在RASENTRYNAME缓冲区的第一个RASENTRYNAME结构中设置dwSize.
const
MaxPhoneEntries = 10;//最多的拨号连接数目
var
intIndex : integer;
PhoneEntries : array[ 0..MaxPhoneEntries - 1 ] of RASEntryName;
dwSize, dwEntries, dwResult : DWORD;
begin
//在RASENTRYNAME缓冲区的第一个RASENTRYNAME结构中设置dwSize
PhoneEntries[ 0 ].dwSize := sizeof( RASEntryName );
dwSize := MaxPhoneEntries * sizeof( RASEntryName );//为缓冲区的大小
//调用RasAPI函数,获取当前系统中可用的拨号连接名称
dwResult := RasEnumEntries ( NIL,'',@PhoneEntries[ 0 ],dwSize, dwEntries );
if dwResult <> 0 then
begin//RasAPI函数,执行错误
memo1.lines.add('RasEnumEntries错误:' + GetRasError( dwResult ));
exit;
end;
//显示当前系统中可用的拨号连接名称
memo1.lines.add('共有' + inttostr( dwEntries ) + '个RAS连接,如下所示');
for intIndex := 0 to dwEntries -1 do
memo1.lines.add( strpas( PhoneEntries[ intIndex ].szEntryName ) );
end;
3、获取默认的拨号连接的名称
默认的拨号连接,即用户在浏览器中设置的拨号连接,该连接可以认为是用户最常用
的拨号连接.
在注册表的HKEY_USERS\.Default\RemoteAccess位置,有一个字符串名Profile,它对应
字符值即为HKEY_USERS\.Default\RemoteAccess\Addresses.
二、新建拨号连接、修改拨号连接的属性
RasAPI函数RasCreatePhonebookEntry、RasEditPhonebookEntry通过调用Win9X的
新建拨号连接、修改拨号连接的设置界面,允许用户新建拨号连接、修改拨号连接,具体
的设置操作还要由系统来完成.
1、新建拨号连接
新建拨号连接的RasAPI函数为RasCreatePhonebookEntry,其函数原型为:
function RasCreatePhonebookEntry(
hwnd : THandle; //新建拨号连接窗口的父窗口的句柄,为NIL表示桌面(DeskTop)
lpszPhonebook: pchar//电话本名称,在Win9X下无作用,可为空字符串
) : DWORD;stdcall;
function RasCreatePhonebookEntry;external RasApiDll name 'RasCreatePhonebookEntryA';
函数返回值为0表示执行成功;否则为错误代码.
下面是一个应用例子,允许用户新建一个拨号连接.
var
dwResult : DWORD;
begin
//在当前窗口中新建拨号连接
dwResult := RasCreatePhonebookEntry( handle, '' );
if dwResult = 0 then
memo1.lines.add('新建拨号连接成功!')
else
memo1.lines.add('新建拨号连接失败:!' + GetRasError( dwResult ))
end;
2、修改拨号连接的属性
修改拨号连接的属性的RasAPI函数为RasEditPhonebookEntry,其函数原型为:
function RasEditPhonebookEntry(
hwnd : THandle; //新建拨号连接窗口的父窗口的句柄,为NIL表示桌面(DeskTop)
lpszPhonebook: pchar;//电话本名称,在Win9X下无作用,可为空字符串
lpszEntryName: pchar//拨号连接的名称,如'163'、'169'等
) : DWORD; stdcall;
function RasEditPhonebookEntry;external RasApiDll name 'RasEditPhonebookEntryA';
函数返回值为0表示执行成功;否则为错误代码.
下面是一个应用例子,允许用户修改指定拨号连接的属性.
var
dwResult : DWORD;
begin
//在当前窗口中修改拨号连接的属性
dwResult := RasEditPhonebookEntry( handle, '', '163' );
if dwResult = 0 then
memo1.lines.add('修改拨号连接成功!')
else
memo1.lines.add('修改拨号连接失败:!' + GetRasError( dwResult ))
end;
三、获取和设置拨号连接的拨号参数
用RasAPI函数RasGetEntryDialParams、RasSetEntryDialParams可以直接获取和设置指定拨号连接的
拨号参数,其中包括用户名称和用户密码!
1、获取拨号连接的拨号参数
获取拨号连接的拨号参数RasAPI函数为RasGetEntryDialParams,其函数原型为:
function RasGetEntryDialParams(
lpszPhonebook: pchar;//电话本名称,在Win9X下无作用,可为空字符串
pRASDIALPARAMS:LPRASDIALPARAMS;//拨号参数,是一个RASDIALPARAMS类型的指针
var lpfPassword : WordBool//是否需要用户密码
) : DWORD; stdcall;
function RasGetEntryDialParams;external RasApiDll name 'RasGetEntryDialParamsA';
参数pRASDIALPARAMS是一个RASDIALPARAMS类型的指针,指向一个拨号连接的拨号参数数据
的缓冲区,其中RASDIALPARAMS及LPRASDIALPARAMS的类型说明如下:
LPRASDIALPARAMS = ^RASDIALPARAMS;
RASDIALPARAMS = record
dwSize : DWORD;//该结构所占内存的大小(Bytes),一般设置为SizeOf(RASDIALPARAMS)
szEntryName : array[0..RAS_MaxEntryName] of char;//拨号连接名称
szPhoneNumber : array[0..RAS_MaxPhoneNumber] of char;//拨号号码
szCallbackNumber : array[0..RAS_MaxCallbackNumber] of char;//回叫号码
szUserName : array[0..UNLEN] of char;//用户名称
szPassword : array[0..PWLEN] of char;//用户密码
szDomain : array[0..DNLEN] of char;//域名
end;
函数返回值为0表示执行成功;否则为错误代码.
下面是一个应用例子,获取指定拨号连接的拨号参数.
var
dwResult : DWORD;
RASDIALPARAMSData : RASDIALPARAMS;
NeedPWD : WordBool;
begin
//指定拨号连接的名称
with RASDIALPARAMSData do
begin
dwSize := sizeof( RASDIALPARAMS );//结构大小
szEntryName := '163';//指定拨号连接的名称
szUserName := '';//其它五个参数初始化
szPassword := '';
szDomain := '';
szCallbackNumber := '';
szPhoneNumber := '';
end;
NeedPWD := true;//需要用户密码
//获取指定拨号连接的拨号参数
dwResult := RasGetEntryDialParams( '',@RASDIALPARAMSData,NeedPWD );
if dwResult <> 0 then //获取指定拨号连接的拨号参数失败
memo1.lines.add( '获取'+StrPAS(RASDIALPARAMSData.szEntryName )+'拨号参数失败:'
+ GetRasError( dwResult ))
else
begin//显示指定拨号连接的拨号参数
memo1.lines.add( StrPAS(RASDIALPARAMSData.szEntryName )+'拨号参数如下');
memo1.lines.add( '用户名称:' + StrPAS(RASDIALPARAMSData.szUserName ));
memo1.lines.add( '用户密码:' + StrPAS(RASDIALPARAMSData.szPassword ));
memo1.lines.add( '域 名:' + StrPAS(RASDIALPARAMSData.szDomain ));
memo1.lines.add( '回叫号码:' + StrPAS(RASDIALPARAMSData.szCallbackNumber ));
memo1.lines.add( '拨号号码:' + StrPAS(RASDIALPARAMSData.szPhoneNumber ));
end;
end;
2、设置拨号连接的拨号参数
设置拨号连接的拨号参数RasAPI函数为RasSetEntryDialParams,其函数原型为:
function RasSetEntryDialParams(
lpszPhonebook: pchar;//电话本名称,在Win9X下无作用,可为空字符串
pRASDIALPARAMS:LPRASDIALPARAMS;//拨号参数,是一个RASDIALPARAMS类型的指针
var lpfPassword : WordBool//是否删除用户密码
) : DWORD; stdcall;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -