请问怎样用Delphi开发win98的拨号网络的软件? 最好有源码。 (200分)

  • 主题发起人 主题发起人 wdj
  • 开始时间 开始时间
W

wdj

Unregistered / Unconfirmed
GUEST, unregistred user!
[?] 用Delphi编程实win98的拨号网络,能构让用户只要把
MODEM在硬件上连好,就可已上网最好。
其它的如:TCP/IP,拨号网络,MODEM的驱动程序,用户一
概不理。由程序来处理。用户只要启动程序,就可上网。
有源码就更好了。
如果有源码请E-mail to:w_dj@163.com
 
用RAS为关键字搜索一下论坛,何苦花冤枉分呢?
 
To j_shen2000:
用RAS为关键字搜索,我已经看过很多次了,可根本拨不通。要不然也不用出此下册。
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=215471
看看,会有帮助的。
 
RAS单元

Unit: Remote Access Service (RAS)
Creation: Feb 18, 1997. Translated from MS-Visual C 4.2 header files
EMail: francois.piette@pophost.eunet.be francois.piette@rtfm.be
http://www.rtfm.be/fpiette
Legal issues: Copyright (C) 1997, 1998 by Fran鏾is PIETTE
Rue de Grady 24, 4053 Embourg, Belgium. Fax: +32-4-365.74.56
<francois.piette@pophost.eunet.be>

This software is provided 'as-is', without any express or
implied warranty. In no event will the author be held liable
for any damages arising from the use of this software.

Permission is granted to anyone to use this software for any
purpose, including commercial applications, and to alter it
and redistribute it freely, subject to the following
restrictions:

1. The origin of this software must not be misrepresented,
you must not claim that you wrote the original software.
If you use this software in a product, an acknowledgment
in the product documentation would be appreciated but is
not required.

2. Altered source versions must be plainly marked as such, and
must not be misrepresented as being the original software.

3. This notice may not be removed or altered from any source
distribution.
Updates:
Sep 25, 1998 V1.10 Added RasGetIPAddress and RasGetProjectionInfoA. Thanks to
Jan Tomasek <xtomasej@fel.cvut.cz> for his help.


* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
unit Ras;

interface

uses
Windows, SysUtils;

{$DEFINE WINVER400}
const
RasUnitVersion = 110;
CopyRight : String = ' RasUnit (c) 97-98 F. Piette V1.10 ';
rasapi32 = 'rasapi32.dll';

UNLEN = 256; // Maximum user name length
PWLEN = 256; // Maximum password length
CNLEN = 15; // Computer name length
DNLEN = CNLEN; // Maximum domain name length

RAS_MaxDeviceType = 16;
RAS_MaxPhoneNumber = 128;
RAS_MaxIpAddress = 15;
RAS_MaxIpxAddress = 21;

{$IFDEF WINVER400}
RAS_MaxEntryName = 256;
RAS_MaxDeviceName = 128;
RAS_MaxCallbackNumber = RAS_MaxPhoneNumber;
{$ELSE}
RAS_MaxEntryName = 20;
RAS_MaxDeviceName = 32;
RAS_MaxCallbackNumber = 48;
{$ENDIF}

RAS_MaxAreaCode = 10;
RAS_MaxPadType = 32;
RAS_MaxX25Address = 200;
RAS_MaxFacilities = 200;
RAS_MaxUserData = 200;

RASCS_OpenPort = 0;
RASCS_PortOpened = 1;
RASCS_ConnectDevice = 2;
RASCS_DeviceConnected = 3;
RASCS_AllDevicesConnected = 4;
RASCS_Authenticate = 5;
RASCS_AuthNotify = 6;
RASCS_AuthRetry = 7;
RASCS_AuthCallback = 8;
RASCS_AuthChangePassword = 9;
RASCS_AuthProject = 10;
RASCS_AuthLinkSpeed = 11;
RASCS_AuthAck = 12;
RASCS_ReAuthenticate = 13;
RASCS_Authenticated = 14;
RASCS_PrepareForCallback = 15;
RASCS_WaitForModemReset = 16;
RASCS_WaitForCallback = 17;
RASCS_Projected = 18;

{$IFDEF WINVER400}
RASCS_StartAuthentication = 19;
RASCS_CallbackComplete = 20;
RASCS_LogonNetwork = 21;
{$ENDIF}
RASCS_SubEntryConnected = 22;
RASCS_SubEntryDisconnected= 23;

RASCS_PAUSED = $1000;
RASCS_Interactive = RASCS_PAUSED;
RASCS_RetryAuthentication = (RASCS_PAUSED + 1);
RASCS_CallbackSetByCaller = (RASCS_PAUSED + 2);
RASCS_PasswordExpired = (RASCS_PAUSED + 3);

RASCS_DONE = $2000;
RASCS_Connected = RASCS_DONE;
RASCS_Disconnected = (RASCS_DONE + 1);

// If using RasDial message notifications, get the notification message code
// by passing this string to the RegisterWindowMessageA() API.
// WM_RASDIALEVENT is used only if a unique message cannot be registered.
RASDIALEVENT = 'RasDialEvent';
WM_RASDIALEVENT = $CCCD;

// TRASPROJECTION
RASP_Amb = $10000;
RASP_PppNbf = $0803F;
RASP_PppIpx = $0802B;
RASP_PppIp = $08021;
RASP_Slip = $20000;

type
THRASCONN = THandle;
PHRASCONN = ^THRASCONN;
TRASCONNSTATE = DWORD;
PDWORD = ^DWORD;
PBOOL = ^BOOL;

TRASDIALPARAMS = packed record
dwSize : DWORD;
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;
{$IFDEF WINVER401}
dwSubEntry : DWORD;
dwCallbackId : DWORD;
{$ENDIF}
szPadding : array [0..2] of Char;
end;
PRASDIALPARAMS = ^TRASDIALPARAMS;

TRASDIALEXTENSIONS = packed record
dwSize : DWORD;
dwfOptions : DWORD;
hwndParent : HWND;
reserved : DWORD;
end;
PRASDIALEXTENSIONS = ^TRASDIALEXTENSIONS;

TRASCONNSTATUS = packed record
dwSize : DWORD;
RasConnState : TRASCONNSTATE;
dwError : DWORD;
szDeviceType : array [0..RAS_MaxDeviceType] of char;
szDeviceName : array [0..RAS_MaxDeviceName] of char;
szPadding : array [0..1] of Char;
end;
PRASCONNSTATUS = ^TRASCONNSTATUS;

TRASCONN = packed record
dwSize : DWORD;
hRasConn : THRASCONN;
szEntryName : array [0..RAS_MaxEntryName] of char;
{$IFDEF WINVER400}
szDeviceType : array [0..RAS_MaxDeviceType] of char;
szDeviceName : array [0..RAS_MaxDeviceName] of char;
{$ENDIF}
szPadding : array [0..0] of Char;
end;
PRASCONN = ^TRASCONN;

TRASENTRYNAME = packed record
dwSize : DWORD;
szEntryName : array [0..RAS_MaxEntryName] of char;
szPadding : array [0..2] of Char;
end;
PRASENTRYNAME = ^TRASENTRYNAME;

TRASENTRYDLG = packed record
dwSize : DWORD;
hWndOwner : HWND;
dwFlags : DWORD;
xDlg : LongInt;
yDlg : LongInt;
szEntry : array [0..RAS_MaxEntryName] of char;
dwError : DWORD;
Reserved : DWORD;
Reserved2 : DWORD;
szPadding : array [0..2] of Char;
end;
PRASENTRYDLG = ^TRASENTRYDLG;

TRASPROJECTION = integer;
TRASPPPIP = record
dwSize : DWORD;
dwError : DWORD;
szIpAddress : array [0..RAS_MaxIpAddress] of char;
end;


function RasDialA(RasDialExtensions: PRASDIALEXTENSIONS;
PhoneBook : PChar;
RasDialParams : PRASDIALPARAMS;
NotifierType : DWORD;
Notifier : Pointer;
RasConn : PHRASCONN
): DWORD; stdcall;
function RasGetErrorStringA(
uErrorValue : DWORD; // error to get string for
szErrorString : PChar; // buffer to hold error string
cBufSize : DWORD // size, in characters, of buffer
): DWORD; stdcall;
function RasHangupA(RasConn: THRASCONN): DWORD; stdcall;
function RasConnectionStateToString(nState : Integer) : String;
function RasGetConnectStatusA(
hRasConn: THRASCONN; // handle to RAS connection of interest
lpRasConnStatus : PRASCONNSTATUS // buffer to receive status data
): DWORD; stdcall;
function RasEnumConnectionsA(
pRasConn : PRASCONN; // buffer to receive connections data
pCB : PDWORD; // size in bytes of buffer
pcConnections : PDWORD // number of connections written to buffer
) : DWORD; stdcall
function RasEnumEntriesA(
Reserved : Pointer; // reserved, must be NIL
szPhonebook : PChar; // full path and filename of phonebook file
lpRasEntryName : PRASENTRYNAME; // buffer to receive entries
lpcb : PDWORD; // size in bytes of buffer
lpcEntries : PDWORD // number of entries written to buffer
) : DWORD; stdcall;
function RasGetEntryDialParamsA(
lpszPhonebook : PChar; // pointer to the full path and filename of the phonebook file
lprasdialparams : PRASDIALPARAMS; // pointer to a structure that receives the connection parameters
lpfPassword : PBOOL // indicates whether the user's password was retrieved
) : DWORD; stdcall;
function RasEditPhonebookEntryA(
hWndParent : HWND; // handle to the parent window of the dialog box
lpszPhonebook : PChar; // pointer to the full path and filename of the phonebook file
lpszEntryName : PChar // pointer to the phonebook entry name
) : DWORD; stdcall;
//function RasEntryDlgA(
// lpszPhonebook : PChar; // pointer to the full path and filename of the phone-book file
// lpszEntry : PChar; // pointer to the name of the phone-book entry to edit, copy, or create
// lpInfo : PRASENTRYDLG // pointer to a structure that contains additional parameters
// ) : DWORD; stdcall;
function RasCreatePhonebookEntryA(
hWndParent : HWND; // handle to the parent window of the dialog box
lpszPhonebook : PChar // pointer to the full path and filename of the phonebook file
) : DWORD; stdcall;

function RasGetProjectionInfoA(
hRasConn : THRASCONN; // handle that specifies remote access connection of interest
RasProjection : TRASPROJECTION; // specifies type of projection information to obtain
lpProjection : Pointer; // points to buffer that receives projection information
lpcb : PDWORD // points to variable that specifies buffer size
) : DWORD; stdcall;
function RasGetIPAddress: string;

implementation


{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function RasConnectionStateToString(nState : Integer) : String;
begin
case nState of
RASCS_OpenPort: Result := 'Opening Port';
RASCS_PortOpened: Result := 'Port Opened';
RASCS_ConnectDevice: Result := 'Connecting Device';
RASCS_DeviceConnected: Result := 'Device Connected';
RASCS_AllDevicesConnected: Result := 'All Devices Connected';
RASCS_Authenticate: Result := 'Starting Authentication';
RASCS_AuthNotify: Result := 'Authentication Notify';
RASCS_AuthRetry: Result := 'Authentication Retry';
RASCS_AuthCallback: Result := 'Callback Requested';
RASCS_AuthChangePassword: Result := 'Change Password Requested';
RASCS_AuthProject: Result := 'Projection Phase Started';
RASCS_AuthLinkSpeed: Result := 'Link Speed Calculation';
RASCS_AuthAck: Result := 'Authentication Acknowledged';
RASCS_ReAuthenticate: Result := 'Reauthentication Started';
RASCS_Authenticated: Result := 'Authenticated';
RASCS_PrepareForCallback: Result := 'Preparation For Callback';
RASCS_WaitForModemReset: Result := 'Waiting For Modem Reset';
RASCS_WaitForCallback: Result := 'Waiting For Callback';
RASCS_Projected: Result := 'Projected';
{$IFDEF WINVER400}
RASCS_StartAuthentication: Result := 'Start Authentication';
RASCS_CallbackComplete: Result := 'Callback Complete';
RASCS_LogonNetwork: Result := 'Logon Network';
{$ENDIF}
RASCS_SubEntryConnected: Result := '';
RASCS_SubEntryDisconnected: Result := '';
RASCS_Interactive: Result := 'Interactive';
RASCS_RetryAuthentication: Result := 'Retry Authentication';
RASCS_CallbackSetByCaller: Result := 'Callback Set By Caller';
RASCS_PasswordExpired: Result := 'Password Expired';
RASCS_Connected: Result := 'Connected';
RASCS_Disconnected: Result := 'Disconnected';
else
Result := 'Connection state #' + IntToStr(nState);
end;
end;


{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function RasGetIPAddress: string;
var
RASConns : TRasConn;
dwSize : DWORD;
dwCount : DWORD;
RASpppIP : TRASPPPIP;
begin
Result := '';
RASConns.dwSize := SizeOf(TRASConn);
RASpppIP.dwSize := SizeOf(RASpppIP);
dwSize := SizeOf(RASConns);
if RASEnumConnectionsA(@RASConns, @dwSize, @dwCount) = 0 then begin
if dwCount > 0 then begin
dwSize := SizeOf(RASpppIP);
RASpppIP.dwSize := SizeOf(RASpppIP);
if RASGetProjectionInfoA(RASConns.hRasConn,
RASP_PppIp,
@RasPPPIP,
@dwSize) = 0 then
Result := StrPas(RASpppIP.szIPAddress);
end;
end;
end;



{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function RasDialA; external rasapi32 name 'RasDialA';
function RasGetErrorStringA; external rasapi32 name 'RasGetErrorStringA';
function RasHangUpA; external rasapi32 name 'RasHangUpA';
function RasGetConnectStatusA; external rasapi32 name 'RasGetConnectStatusA';
function RasEnumConnectionsA; external rasapi32 name 'RasEnumConnectionsA';
function RasEnumEntriesA; external rasapi32 name 'RasEnumEntriesA';
function RasGetEntryDialParamsA; external rasapi32 name 'RasGetEntryDialParamsA';
function RasEditPhonebookEntryA; external rasapi32 name 'RasEditPhonebookEntryA';
//function RasEntryDlgA; external rasapi32 name 'RasEntryDlgA';
function RasCreatePhonebookEntryA; external rasapi32 name 'RasCreatePhonebookEntryA';
function RasGetProjectionInfoA; external rasapi32 name 'RasGetProjectionInfoA';

{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}

end.

{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}

直接调用API就可以了!
 
这种控件有的是!
自己去找找!
 
转帖
用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函数
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;
function RasSetEntryDialParams;external RasApiDll name
'RasSetEntryDialParamsA';
参数pRASDIALPARAMS的说明同RasGetEntryDialParams.
参数lpfPassword的含义与RasGetEntryDialParams不同,在此表示
是否删除用户密码,为
  TRUE时将原来的用户密码删除.
    
    函数返回值为0表示执行成功;否则为错误代码.
    下面是一个应用例子,设置指定拨号连接的拨号参数.
var
dwResult : DWORD;
RASDIALPARAMSData : RASDIALPARAMS;
RemovePWD : WordBool;
begin
//指定拨号连接的拨号参数
with RASDIALPARAMSData do
begin
dwSize := sizeof( RASDIALPARAMS );//结构大小
szEntryName := '163';//指定拨号连接的名称
szUserName := 'MyName';//指定用户名称
szPassword := 'MyPassword';//指定用户密码
szDomain := 'MyDomain';//指定域名
szCallbackNumber := '';//指定回叫号码
szPhoneNumber := '';//指定拨号号码
end;
RemovePWD := false;//不需要删除用户密码

//设置指定拨号连接的拨号参数
dwResult := RasSetEntryDialParams(
'',@RASDIALPARAMSData,RemovePWD );

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;

四、用指定的拨号连接拨号、挂断指定的拨号连接
  1、用指定的拨号连接拨号
    拨号有两种方法,一种是调用拨号网络中的拨号程序,就
象用户自己用鼠标双击拨号连接名称一
  样,用户可以修改拨号号码、用户名称和用户密码,最后由拨
号网络来完成拨号过程;另一个方法则
  是调用RasAPI函数.
(1)用拨号网络中的拨号程序
       在程序中可以用如下代码:
       winexec('rundll32.exe rnaui.dll,RnaDial 169',
SW_SHOWNORMAL);
       其中字符串中的最后一个参数“169”为拨号连接的
名称。
(2)用RasAPI函数拨号
    用拨号连接拨号的RasAPI函数为RasDial,其函数原型为:
function RasDial(
pRasDialExtensions : LPRASDIALEXTENSIONS;//在WIN9X下无用,可
设置为NIL
lpszPhonebook : PChar;//电话本名称,在Win9X下无作用,可为空
字符串
lpRasDialParams : LPRASDIALPARAMS;//拨号参数
dwNotifierType : DWORD;//消息通知方式
handle : TRasDialFunc;//消息处理事件
var lphRasConn : DWORD//返回的成功连接的连接句柄
) : DWORD; stdcall;
function RasDial;external RasApiDll name 'RasDialA';

    参数pRASDIALPARAMS的说明同RasGetEntryDialParams.
    参数dwNotifierType表示消息通知方式.在拨号过程中,
系统发出拨号事件消息可以通知拨号
  进度,因而需要提供接受消息的方式和处理消息的函数.当其
值为$FFFFFFFF时,则参数handle被
  视为一个窗口的句柄,事件消息被发生该窗口处理;当其值为0
时,handle被视为TRasDialFunc类型
  的函数的指针;当其值为1时,handle被视为TRasDialFunc1类
型的函数的指针.
    参数handle表示消息处理函数指针,其类型可以THandle、
TRasDialFunc、TRasDialFunc1.当该
  参数不为NULL或NIL时,其代表的消息处理函数指针将接受拨号
进度通知消息;为NIL时,拨号过程由
  异步方式变为同步方式,直到拨号过程成功或失败后RasDial函
数才返回.详细可参见Delphi帮助文件
  中关于RasDial函数的帮助。
    当拨号连接成功时,lphRasConn将表示其连接句柄.

    函数返回值为0表示执行成功;否则为错误代码.
    下面是一个应用例子,按指定的拨号参数拨号.

var
RASDIALPARAMSData : RASDIALPARAMS;
dwResult : DWord;
RasCon : DWord;
begin
//指定拨号连接的拨号参数
with RASDIALPARAMSData do
begin
dwSize := sizeof( RASDIALPARAMS );//结构大小
szEntryName := '163';//指定拨号连接的名称
szUserName := 'MyName';//指定用户名称
szPassword := 'MyPassword';//指定用户密码
szDomain := 'MyDomain';//指定域名
szCallbackNumber := '';//指定回叫号码
szPhoneNumber := '';//指定拨号号码
end;

//用指定的拨号参数拨号,采用同步拨号方式
dwResult := RasDial( NIL,'',@RASDIALPARAMSData,0,NIL,RasCon
);

if dwResult <> 0 then //设置指定拨号连接的拨号参数失败
memo1.lines.add( '用'+StrPAS(RASDIALPARAMSData.szEntryName
)+'拨号失败:'
+ GetRasError( dwResult ))
else
memo1.lines.add( '用'+StrPAS(RASDIALPARAMSData.szEntryName
)+'拨号成功!' );
end;

  2、挂断指定的拨号连接
    挂断拨号连接的RasAPI函数为RasHangUp,其函数原型为:
function RasHangUp(
hRasConn : DWORD//要挂断的拨号连接的句柄
) : DWORD; stdcall;
function RasHangUp;external RasApiDll name 'RasHangUpA';
    函数返回值为0表示执行成功;否则为错误代码.
    下面是一个应用例子,挂断由RasDial建立的拨号连接.

//挂断由RasDial建立的拨号连接
dwResult := RasHangUp( RasCon );
if dwResult <> 0 then //挂断失败
memo1.lines.add( '挂断失败:' + GetRasError( dwResult ))
else
memo1.lines.add( '挂断成功!');

五、获取当前活动的连接及其连接状态
  1、获取当前活动的连接
    获取当前活动的连接的RasAPI函数为
RasEnumConnections,其函数原型为:
function RasEnumConnections( var lprasconn : RASCONN ;//接
收活动连接的缓冲区的指针
var lpcb: DWORD;//缓冲区大小
var lpcConnections : DWORD//实际的活动连接数
) : DWORD; stdcall;
function RasEnumConnections;external RasApiDll name
'RasEnumConnectionsA';
参数lprasconn提供了一个RASCONN类型数组的指针,指向一个接收
活动连接的缓冲
  区,其中RASCONN的类型说明如下:
RASCONN = record
dwSize : DWORD;//该结构所占内存的大小(Bytes),一般设置为
SizeOf(RASCONN)
hrasconn : HRASCONN;//活动连接的句柄
szEntryName : array[0..RAS_MaxEntryName] of char;//活动连接
的名称
szDeviceType : array[0..RAS_MaxDeviceType] of char;//活动连
接的所用的设备类型
szDeviceName : array[0..RAS_MaxDeviceName] of char;//活动连
接的所用的设备名称
end;
    参数lpcb为缓冲区大小(Bytes).
    参数lpcConnections将返回实际的连接数目.

    函数返回值为0表示执行成功;否则为错误代码.

  2、获取指定连接的连接状态
    获取指定连接的连接状态的RasAPI函数为
RasGetConnectStatus,其函数原型为:
function RasGetConnectStatus(
hrasconn : HRASCONN; //指定活动连接的句柄
lprasconnstatus : LPRASCONNSTATUS//连接状态参数
) : DWORD; stdcall;
function RasGetConnectStatus;external RasApiDll name
'RasGetConnectStatusA';
    连接状态参数lprasconnstatus是一个RASCONNSTATUS类型
的指针,将返回连接状态参数.
  RASCONNSTATUS和LPRASCONNSTATUS的类型说明如下:
LPRASCONNSTATUS = ^RASCONNSTATUS;
RASCONNSTATUS = record
dwSize : DWORD;//该结构所占内存的大小(Bytes),一般设置为
SizeOf(RASCONNSTATUS)
rasconnstate : RASCONNSTATE;//连接状态标识,一组DWORD类型数
值的集合。
dwError : DWORD;//错误类型标识符
szDeviceType : array[0..RAS_MaxDeviceType] of char;//活动连
接的所用的设备类型
szDeviceName : array[0..RAS_MaxDeviceName] of char;//活动连
接的所用的设备名称
end;
    函数返回值为0表示执行成功;否则为错误代码.

    下面是一个应用例子,列出了当前系统中活动的连接的名
称及其连接状态.
注意,应在RASCONN缓冲区的第一个RASCONN结构中设置dwSize.

const
MaxConnections = 10;//最多的拨号连接数目
var
connections : array[0..MaxConnections-1] of RASCONN;
longSize : dword;
intAvailabelConnections : dword;
intIndex : integer;
dwResult : DWORD;
strTemp : string;
RASCONNSTATUSData : RASCONNSTATUS;
begin
connections[ 0 ].dwSize := sizeof(RASCONN);//结构的大小
longSize := MaxConnections * connections[ 0 ].dwSize;//缓冲
区大小
intAvailabelConnections := 0;//实际的活动连接的数目
//获取当前系统中活动的连接
dwResult := RasEnumConnections( connections[ 0 ], longSize,
intAvailabelConnections );
if dwResult <> 0 then //获取当前系统中活动的连接
memo1.lines.add( '获取当前系统中活动的连接:' +
GetRasError( dwResult ))
else
begin
memo1.lines.add( '当前系统中活动的连接' + inttostr(
intAvailabelConnections )
+ '个,列举如下' );
for intIndex := 0 to intAvailabelConnections - 1 do
begin
strTemp := '连接名称:' + StrPAS( connections[ intIndex
].szEntryName )
+ ' 设备类型:' + StrPAS( connections[ intIndex
].szDeviceType )
+ ' 设备名称:' + StrPAS( connections[ intIndex
].szDeviceName );
//获取连接状态
dwResult := RasGetConnectStatus( connections[ intIndex
].hRasConn,@RASCONNSTATUSData );
if 0 <> dwResult then
strTemp := strTemp + ' 连接状态未知:' + GetRasError(
dwResult )
else if RASCONNSTATUSData.rasconnstate = RASCS_Connected
then
strTemp := strTemp + ' 连接状态:已连接'
else
strTemp := strTemp + ' 连接状态:(' +
inttostr(RASCONNSTATUSData.rasconnstate)+')';
memo1.lines.add( strTemp );
end;
end;
end;

 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
907
DelphiTeacher的专栏
D
D
回复
0
查看
865
DelphiTeacher的专栏
D
后退
顶部