📄 wzjh48.htm
字号:
<html>
<head>
<meta NAME="GENERATOR" Content="Microsoft FrontPage 3.0">
<meta HTTP-EQUIV="Content-Type" content="text/html; charset=gb2312">
<meta HTTP-EQUIV="Expires" CONTENT="0">
<title>在DELPHI程序管理拨号网络</title>
<style type="text/css">
<!--
BODY {
BACKGROUND: white; FONT-FAMILY: 宋体; FONT-SIZE: 9pt
}
.font1 {
FONT-FAMILY: "宋体"; FONT-SIZE: 11pt
; line-height: 130%}
A {
COLOR: #000080; FONT-FAMILY: 宋体, "Arial"; FONT-SIZE: 9pt; TEXT-DECORATION: none; TEXT-TRANSFORM: none
}
A:hover {
COLOR: red; FONT-SIZE: 9pt
}
TD {
FONT-FAMILY: 宋体, "Arial", "Times New Roman"; line-height: 150%; FONT-SIZE: 9pt
}
-->
</style>
<body>
<table width=100% cellspacing='0' cellpadding='0' align='center' border='0'>
<tr bgcolor="#FFFFFF">
<td class='tt2' >
<table border="0" cellpadding="2" cellspacing="1" width="100%" align="center">
<tr bgcolor="#FFFFFF">
<td align="centr" valign="top" class="font1"><font color="#000000">
<br>
在DELPHI程序管理拨号网络 <br>
  作者:王军发 <br>
   <br>
   <br>
   用MODEM拨号上网,仍是大多数个人网民选择上网的方式.如果能在我们的应用程序中管理拨号 网络(如Foxmail、Sygate中的拨号功能),无疑将会方便我们的软件用户(不用再切换应用程序,
运行拨号网络),提高我们的软件的友好性从而提高软件的竞争力. <br>
   <br>
   在WIN9X下,如果安装了拨号网络,则在WINDOWS系统的系统目录System下将有两个拨号网络管理 程序库RasApi32.DLL和RasApi16.DLL,我们可利用其中的函数来获取和设置拨号连接网络的信息。在
Delphi帮助文件中,有相关函数的说明。 <br>
   <br>
   在此,我们要讨论的管理项目有: <br>
  1、获取当前系统中可用的拨号连接名称 <br>
   2、新建拨号连接、修改拨号连接的属性 <br>
   3、获取和设置拨号连接的拨号参数 <br>
   4、用指定的拨号连接拨号、挂断指定的拨号连接 <br>
   5、获取当前活动的连接及其连接状态零、获取RasAPI函数执行失败的错误信息 <br>
   <br>
   RasAPI的调用接口是统一的,但对于不同的Windows版本,许多常量和数据结构的定义是不同的。 如果使用的数据结构与Windows版本不对应,RasAPI函数执行会失败;另外,其它原因如其它程序也
在使用同一个拨号连接进行拨号等,也会造成RasAPI函数执行失败.鉴于此原因,我们需要先讨论获 取RasAPI函数执行失败的错误信息的函数。
<br>
   当一个RasAPI函数执行结束时,会返回一个结果标识,为0时表示执行成功,否则作为一个错误标 识符表示执行失败的原因。RasAPI函数RasGetErrorString可以根据错误标识符返回其错误描述信息,
<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 'RasGetErrorStringA';
<br>
  ( 注:RasApiDll = 'Rasapi32.dll'; ) <br>
   <br>
   为了方便,我们可以自己编写一个函数,用于获取RasAPI函数执行失败的错误信息。在下面的例 <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 )//如果能正确返回错误信息,则转化为Pascal字符串 <br>
  else//否则返回16进制形式的错误代码 <br>
  result := 'GetRasError Failure:ErrorID=' + Format( '%x',[ErrorID]
); <br>
  end; <br>
   <br>
  一、获取当前系统中可用的拨号连接名称 <br>
   即获取系统中已建立的拨号连接的名称,可用来让用户选择使用哪个拨号连接进行拨号. <br>
   可以用两种方法来实现.一种是利用RasAPI函数;另一种是不用RasAPI函数,直接在注册表中查询. <br>
   <br>
   1、不用RasAPI函数,直接在注册表中查询 <br>
   在注册表的HKEY_USERS\.Default\RemoteAccess\Addresses下,列出了已经在拨号网络中建立的拨号连接的名称及其属性设置,其中各项目的名称即为可用的拨号连接的名称;各项目的值即为各拨号连接的属性设置,不过是二进制串,笔者还看不懂.由此可见,我们只要读出各项目的名称即可获取当前系统中可用的拨号连接名称.
<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>
  end; <br>
  combobox1.Items.assign( stringsTemp );//显示,供选择 <br>
  end; <br>
   <br>
   2、用RasAPI函数 <br>
  RasAPI函数RasEnumEntries可获取当前系统中可用的拨号连接名称.其函数原型为 <br>
  function RasEnumEntries(reserved : PChar;//保留字段,必须为NIL <br>
  lpszPhonebook : PChar;//电话本名称,在Win9X下无作用,可为空字符串 <br>
  lprasentryname : LPRASENTRYNAME;//接收拨号连接名称的缓冲区,是一个RASENTRYNAME类型数组的指针
<br>
  var lpcb : DWORD;//接收拨号连接名称的缓冲区的大小(Bytes) <br>
  var lpcEntries: DWORD//实际获得的拨号连接名称的数目 <br>
  ) : DWORD; stdcall; <br>
  function RasEnumEntries;external RasApiDll name 'RasEnumEntriesA';
<br>
   <br>
  参数lprasentryname提供了一个RASENTRYNAME类型数组的指针,指向一个接收拨号连接名称的缓冲区,其中RASENTRYNAME及LPRASENTRYNAME的类型说明如下:
<br>
   <br>
  LPRASENTRYNAME = ^RASENTRYNAME; <br>
  RASENTRYNAME = record <br>
  dwSize : DWORD;//该结构所占内存的大小(Bytes),一般设置为SizeOf(RASENTRYNAME)
<br>
  szEntryName : array [ 0..RAS_MaxEntryName ] of char;//拨号连接名称
<br>
  end; <br>
   lpcb为缓冲区的大小,一般设置为dwSize的倍数,倍数为可能有的连接的个数. <br>
   lpcEntries实际的连接的个数. <br>
   <br>
   下面是一个应用例子,列出了当前系统中可用的拨号连接名称. <br>
  注意,应在RASENTRYNAME缓冲区的第一个RASENTRYNAME结构中设置dwSize. <br>
  const MaxPhoneEntries = 10;//最多的拨号连接数目 <br>
  var intIndex : integer; <br>
  PhoneEntries : array[ 0..MaxPhoneEntries - 1 ] of 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>
  //调用RasAPI函数,获取当前系统中可用的拨号连接名称 <br>
  dwResult := RasEnumEntries ( NIL,'',@PhoneEntries[ 0 ],dwSize,
dwEntries ); <br>
   <br>
  if dwResult <> 0 then <br>
  begin//RasAPI函数,执行错误 <br>
  memo1.lines.add('RasEnumEntries错误:' + GetRasError( dwResult
)); <br>
  exit; <br>
  end; <br>
   <br>
  //显示当前系统中可用的拨号连接名称 <br>
  memo1.lines.add('共有' + inttostr( dwEntries ) + '个RAS连接,如下所示');
<br>
  for intIndex := 0 to dwEntries -1 do <br>
  memo1.lines.add( strpas( PhoneEntries[ intIndex ].szEntryName
) ); <br>
  end; <br>
   <br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -