在WIN9X下,如果安裝了撥號網絡,則在WINDOWS的系統目錄(System目錄)下將有兩個撥號網絡管理程序庫RasApi32.DLL 和RasApi16.DLL,因此我們可以利用RAS(遠程訪問服務)系列函數實現斷開指定的撥號連接。在這里我們將使用RasHangUp函數。然而如何正確使用這些API函數是完成應用程序的關鍵。 掛斷撥號連接的RasApi32函數為RasHangUp,其函數原型為: RasHangUp( HRASCONN : DWORD ):DWORD;stdcall; 參數說明: HRASCONN : DWORD要掛斷的撥號連接的句柄,此句柄是來源由調用函數RasEnumConnections的返回值。 返回值:函數的返回值為0表示執行成功;不為0執行失敗。 由上面的函數得知:我們必須首先獲得撥號連接的句柄,因此在應用程序中還需使用RasEnumConnections函數。 獲取所有活動的撥號連接的信息列表(連接句柄和電話號碼)的RasApi32函數為RasEnumConnections,其函數原型為: RasEnumConnections(LPRASCONN lprasconn,LPDWORD lpcb,LPDWORD lpcConnections) :DWORD;stdcall; 參數說明: lprasconn:接收活動連接的緩沖區的指針; lpcb:接收緩沖區的字節大小; lpcConnections:實際的活動連接數。 返回值函數的返回值為0表示執行成功;不為0執行失敗。 為了正確使用這兩個函數,我們要事先定義函數,常數,結構類型及其他信息,有關這一部份的內容都寫入rasapi.pas單元。 源程序: program main;
uses
Forms, Unit1 in 'Unit1.pas' {Form1}, rasapi in 'rasapi.pas';
{$R *.RES}
begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, DdeMan;
type
TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var
Form1: TForm1;
implementation
uses rasapi;
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject); var bufsize: Cardinal; numEntries: Cardinal; x: Integer; entries: Array[1..10] of TRasConn;//撥號連接數組(假設最多有10個活動的撥號連接) stat: TRasConnStatus; hRas: HRasConn; conexion:pRasConn; begin entries[1].dwSize := SizeOf(TRasConn); bufsize := SizeOf(TRasConn) * 10; FillChar(stat, Sizeof(TRasConnStatus), 0); stat.dwSize := Sizeof(TRasConnStatus); if RasEnumConnections(@entries[1], bufsize, numEntries) = 0 then begin if numEntries > 0 then with entries[1] do begin conexion:=Pointer(rasconn); hRas := Longint(conexion); if RasHangUp(hRas) <> 0 then ShowMessage('斷開失敗'); end else ShowMessage('斷開成功'); end; end;
unit rasapi;
interface
Uses WinTypes, WinProcs, Dialogs;
Const
UNLEN = 256; PWLEN = 256; DNLEN = 15; RAS_MaxEntryName = 256;//連接名稱最大長度 RAS_MaxDeviceName = 128;//設備名稱最大長度 RAS_MaxDeviceType = 16;//設備類型名稱長度 { RAS_MaxParamKey = 32; RAS_MaxParamValue = 128;} RAS_MaxPhoneNumber = 128;//電話號碼的最大長度 RAS_MaxCallbackNumber = RAS_MaxPhoneNumber;
Type
{UINT = Word;} PHRASConn = ^HRASConn; Type
{ 確認一活動的撥號連接. (為RasConnectEnum函數使用) }
PRASConn = ^TRASConn;//撥號連接的句柄類型 TRASConn = record dwSize: DWORD;//該結構類型所占內存的字節大小 rasConn: HRASConn;//活動連接的句柄 szEntryName: Array[0..RAS_MaxEntryName] Of Char;// szDeviceType : Array[0..RAS_MaxDeviceType] Of Char; szDeviceName : Array [0..RAS_MaxDeviceName] of char; end;
PRASConnStatus = ^TRASConnStatus; TRASConnStatus = Record dwSize: LongInt; rasConnstate: Word; dwError: LongInt; szDeviceType: Array[0..RAS_MaxDeviceType] Of Char; szDeviceName: Array[0..RAS_MaxDeviceName] Of Char; End;
PRASDIALEXTENSIONS= ^TRASDIALEXTENSIONS;
TRASDIALEXTENSIONS= Record dwSize: DWORD; dwfOptions: DWORD; hwndParent: HWnd; reserved: DWORD; end;
PRASDialParams = ^TRASDialParams; TRASDialParams = 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; end;
PRASEntryName = ^TRASEntryName;
TRASEntryName = Record dwSize: LongInt; szEntryName: Array[0..RAS_MaxEntryName] Of Char; { Reserved: Byte;} End;
//撥號函數
Function RasDial( lpRasDialExtensions : PRASDIALEXTENSIONS ; //在WIN9X下無用,可設置為NIL lpszPhonebook: PChar; //在WIN9X下無用,可設置為NIL lpRasDialParams : PRASDIALPARAMS; // 撥號參數,類型指針 dwNotifierType : DWORD; { 消息通知方式} lpvNotifier: DWORD; { 消息處理事件} var rasConn: HRASConn { 返回成功連接的連接句柄} ): DWORD; stdcall;
function RasEnumConnections(RASConn: PrasConn; var BufSize: DWord; var Connections: DWord ): LongInt; stdcall;
Function RasEnumEntries ( reserved: PChar; {保留字段,必須為空} lpszPhonebook: PChar ; { 電話本名稱,在WIN9X下無用,可設置為NIL} lprasentryname: PRASENTRYNAME ; {接收撥號連接名稱的緩沖區,是一類型數組的指針} var lpcb : DWORD; {接收撥號連接名稱的緩沖區的大小} var lpcEntries : DWORD {實際獲得撥號連接 的數目} ) : DWORD; stdcall;
function RasGetConnectStatus(RASConn: hrasConn; { 指定活動連接的句柄 } RASConnStatus: PRASConnStatus { 獲取活動連接狀態信息的緩沖區} ): LongInt; stdcall;
function RasGetErrorString(ErrorCode: DWord; { 錯誤代碼標識} szErrorString: PChar; { 錯誤提示信息的緩沖區} BufSize: DWord {錯誤提示信息的緩沖區的大小 } ): LongInt; stdcall;
function RasHangUp(RASConn: hrasConn ): LongInt; stdcall;
function RasGetEntryDialParams( lpszPhonebook:PChar; {電話本名稱,在WIN9X下無用,可設置為NIL } VAR lprasdialparams:TRASDIALPARAMS; {撥號參數,是一類型指針} VAR lpfPassword : BOOL {顯示是否需要用戶密碼} ): DWORD; stdcall;
implementation
const
RAS_DLL = 'RASAPI32';
function RasDial; external RAS_DLL name 'RasDialA';
function RasEnumConnections; external RAS_DLL name 'RasEnumConnectionsA';
function RasEnumEntries; external RAS_DLL name 'RasEnumEntriesA';
function RasGetConnectStatus; external RAS_DLL name 'RasGetConnectStatusA';
function RasGetErrorString; external RAS_DLL name 'RasGetErrorStringA';
function RasHangUp; external RAS_DLL name 'RasHangUpA';
function RasGetEntryDialParams; external RAS_DLL name 'RasGetEntryDialParamsA';
end.
以上代碼在PWIN98+DELPHI5環境下調試通過。
|