在Delphi 程 序 中 拨 号 上 网
教程打包下载
在Delphi 程 序 中 拨 号 上 网
深 圳 华 讯 通 信 公 司(518040) 王 发 军
在Win9X 下, 如 果 安 装 了 拨 号 网 络, 则 在 Windows 系 统 的 系 统 目 录System
下 将 有 两 个 拨 号 网 络 管 理 程 序 库 RasApi32.DLL 和RasApi16.DLL, 我 们 可
利 用 其 中 的 函 数 来 创 建、 修 改 拨 号 连 接, 并 利 用 指 定 的 拨 号 连 接 进 行 拨 号
上 网。
新 建 拨 号 连 接
当Win9X 系 统 中 已 经 建 立 了 拨 号 连 接, 则 可 利 用 现 成 的 拨 号 连 接。 如 果 没
有 拨 号 连 接, 则 需 要 新 建 一 个 拨 号 连 接。RasAPI 中 提 供 了 相 应 的 函 数, 其 函
数 名 为 RasCreatePhonebookEntryA, 函 数 原 型 为:
function RasCreatePhonebookEntryA( hwnd : THandle;lpszPhonebook:
pchar ) : DWORD;
stdcall; { 位 于interface 部 分 }
function RasCreatePhonebookEntryA ; external
'Rasapi32.dll';{ 位 于implementation 部 分 }
参 数:
hwnd(THandle): 新 建 拨 号 连 接 窗 口 的 父 窗 口 的 句 柄, 可 以 为TForm 的Handle,
为NIL 表 示 Windows 桌 面(DeskTop)
lpszPhonebook(pchar): 电 话 本 名 称, 在Win9X 下 无 作 用, 可 设 为 空 字 符
串
函 数 返 回 值:
0 表 示 执 行 成 功; 否 则 为 错 误。
下 面 是 一 个 新 建 拨 号 连 接 的 例 子: procedure TForm1.Button1Click(Sender:
TObject); var dwResult : DWORD; begin // 在 当 前 窗 口 中 新 建 拨 号 连
接 dwResult := RasCreatePhonebookEntryA( handle, '' ); if dwResult
= 0 then memo1.lines.add(' 新 建 拨 号 连 接 成 功!') else memo1.lines.add('
新 建 拨 号 连 接 失 败!') end; 修 改 指 定 拨 号 连 接 的 属 性
如 果 用 户 需 要 修 改 拨 号 连 接 的 属 性, 如 电 话 号 码、 国 家 及 区 号、 连 接 方 式、
服 务 器 类 型 等, 可 以 用RasAPI 函 数 来 实 现, 其 函 数 名 为RasEditPhonebookEntryA,
函 数 原 型 为:
function RasEditPhonebookEntryA( hwnd : THandle; lpszPhonebook:
pchar; lpszEntryName: pchar ) : DWORD;stdcall; { 位 于interface
部 分 }
function RasEditPhonebookEntryA; external 'Rasapi32.dll';{ 位
于implementation 部 分 }
参 数:
hwnd(THandle): 新 建 拨 号 连 接 窗 口 的 父 窗 口 的 句 柄, 可 以 为TForm 的Handle,
为NIL 表 示 Windows 桌 面(DeskTop)
lpszPhonebook(pchar): 电 话 本 名 称, 在Win9X 下 无 作 用, 可 设 为 空 字 符
串
lpszEntryName:( pchar): 要 修 改 的 拨 号 连 接 的 名 称, 如'163'、'169'
等
函 数 返 回 值:
0 表 示 执 行 成 功; 否 则 为 错 误。
下 面 是 一 个 修 改 指 定 拨 号 连 接 属 性 的 例 子: procedure TForm1.Button2Click(Sender:
TObject); var dwResult : DWORD; strDialName : string; begin strDialName
:= '163';// 拨 号 连 接 的 名 称 设 为163 // 在 当 前 窗 口 中 指 定 修 改 拨 号 连
接 的 属 性 dwResult := RasEditPhonebookEntryA ( handle, '', PChar(
strDialName ) ); if dwResult = 0 then memo1.lines.add(' 修 改 拨
号 连 接' + strDialName + ' 成 功!') else memo1.lines.add(' 修 改 拨 号
连 接' + strDialName + ' 失 败!') end;
获 取 当 前 系 统 中 可 用 的 拨 号 连 接 名 称
为 了 让 用 户 选 择 使 用 拨 号 连 接 进 行
拨 号, 我 们 需 要 获 取 系 统 中 已 建 立 的 拨 号 连 接 的 名 称。 在 建 立 了 拨 号 连 接
后,Win9X 将 拨 号 连 接 的 名 称 和 属 性 写 在 了 注 册 表 中, 我 们 可 以 从 注 册 表 中
获 取 当 前 系 统 中 可 用 的 拨 号 连 接 名 称 及 在Internet Explorer 中 设 置 的 默
认 连 接 名 称。
在 注 册 表 的 HKEY_USERS\.Default\RemoteAccess\Addresses 下, 列 出
了 已 经 在 拨 号 网 络 中 建 立 了 的 拨 号 连 接 的 名 称 及 其 属 性 设 置, 其 中 各 项 目
的 名 称 即 为 可 用 的 拨 号 连 接 的 名 称; 各 项 目 的 值 即 为 各 拨 号 连 接 的 属 性 设
置。 我 们 只 要 读 出 各 项 目 的 名 称 即 可 获 取 当 前 系 统 中 可 用 的 拨 号 连 接 名 称。
如 果 在Internet Explorer 中 设 置 了 默 认 连 接 名 称( 查 看=》Internet 选
项=》 连 接=》 连 接=》 设 置=》 使 用 以 下 拨 号 网 络 连 接), 则 在 注 册 表 的HKEY_USERS\.Default\RemoteAccess
下, 有 一 个 字 符 串 类 型 的 键 值, 键 值 名InternetProfile, 其 值 即 为Internet
Explorer 中 设 置 的 默 认 连 接 名 称。
下 面 是 一 个 获 取 当 前 系 统 中 可 用 的 拨 号 连 接 名 称 的 例 子:
{ 注 意 在Uses 中 增 加Registry 单 元, 用 于 操 作 注 册 表 } procedure TForm1.Button3Click(Sender:
TObject); var registryTemp : TRegistry; stringsTemp : TStringlist;
intIndex : integer; 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 );// 读 出 各 项 目 的 名 称, 即 拨 号 连 接 名 称 CloseKey; end;
// 当 前 系 统 中 可 用 的 拨 号 连 接 memo1.lines.add( ' * * * * * * * *
* * * * * * * * * * 当 前 系 统 中 有' + IntToStr( stringsTemp.count
) + ' 个 可 用 的 拨 号 连 接 如 下 * * * * * * * * * * * * * * * *'); for
intIndex := 0 to stringsTemp.count - 1 do memo1.lines.add( stringsTemp.strings[
intIndex ] ); // 列 出Internet Explorer 中 设 置 的 默 认 连 接 名 称 if registryTemp.OpenKey('.Default\RemoteAccess',false)
then memo1.lines.add( 'Internet Explorer 中 设 置 的 默 认 连 接 名 称 为'
+registryTemp.ReadString ('InternetProfile') ); // 释 放 内 存 registryTemp.free;
stringsTemp.free; end; 用 指 定 的 拨 号 连 接 拨 号
最 好 的 方 法 就 是 调 用Win9X 的 拨 号 网 络 服 务 了, 就 是 运 行Win9X 下 的 现 成
程 序。
在Delphi 程 序 中 可 以 用 如 下 代 码 实 现 拨 号 上 网:
winexec('rundll32.exe rnaui.dll,RnaDial 163',SW_SHOWNORMAL);
其 中 字 符 串 中 的 最 后 一 个 参 数"163" 为 拨 号 连 接 的 名 称。
下 面 是 一 个 用 指 定 的 拨 号 连 接 拨 号 上 网 的 例 子: procedure TForm1.Button4Click(Sender:
TObject); var strDialName : string; begin strDialName := '163';
// 拨 号 连 接 的 名 称 设 为163 memo1.lines.add( ' * * * * * * * * * *
* * * * * * * * 用 拨 号 连 接' + strDialName +' 实 现 拨 号 上 网 * * *
* * * * * * * * * * * * *'); winexec( PChar('rundll32.exe rnaui.dll,RnaDial
' + strDialName),SW_SHOWNORMAL); end;
以 上 程 序 在Pwin98 +Delphi3.0 下 调 试 通 过。