用Delphi編寫(xiě)可以斷開(kāi)Internet連接的程序
發(fā)表時(shí)間:2023-07-17 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]在WIN9X下,如果安裝了撥號(hào)網(wǎng)絡(luò),則在WINDOWS的系統(tǒng)目錄(System目錄)下將有兩個(gè)撥號(hào)網(wǎng)絡(luò)管理程序庫(kù)RasApi32.DLL 和RasApi16.DLL,因此我們可以利用RAS(遠(yuǎn)程訪(fǎng)問(wèn)...
在WIN9X下,如果安裝了撥號(hào)網(wǎng)絡(luò),則在WINDOWS的系統(tǒng)目錄(System目錄)下將有兩個(gè)撥號(hào)網(wǎng)絡(luò)管理程序庫(kù)RasApi32.DLL 和RasApi16.DLL,因此我們可以利用RAS(遠(yuǎn)程訪(fǎng)問(wèn)服務(wù))系列函數(shù)實(shí)現(xiàn)斷開(kāi)指定的撥號(hào)連接。在這里我們將使用RasHangUp函數(shù)。然而如何正確使用這些API函數(shù)是完成應(yīng)用程序的關(guān)鍵。
掛斷撥號(hào)連接的RasApi32函數(shù)為RasHangUp,其函數(shù)原型為:
RasHangUp(
HRASCONN : DWORD
):DWORD;stdcall;
參數(shù)說(shuō)明:
HRASCONN : DWORD要掛斷的撥號(hào)連接的句柄,此句柄是來(lái)源由調(diào)用函數(shù)RasEnumConnections的返回值。
返回值:函數(shù)的返回值為0表示執(zhí)行成功;不為0執(zhí)行失敗。
由上面的函數(shù)得知:我們必須首先獲得撥號(hào)連接的句柄,因此在應(yīng)用程序中還需使用RasEnumConnections函數(shù)。
獲取所有活動(dòng)的撥號(hào)連接的信息列表(連接句柄和電話(huà)號(hào)碼)的RasApi32函數(shù)為RasEnumConnections,其函數(shù)原型為:
RasEnumConnections(LPRASCONN lprasconn,LPDWORD lpcb,LPDWORD lpcConnections) :DWORD;stdcall;
參數(shù)說(shuō)明:
lprasconn:接收活動(dòng)連接的緩沖區(qū)的指針;
lpcb:接收緩沖區(qū)的字節(jié)大小;
lpcConnections:實(shí)際的活動(dòng)連接數(shù)。
返回值函數(shù)的返回值為0表示執(zhí)行成功;不為0執(zhí)行失敗。
為了正確使用這兩個(gè)函數(shù),我們要事先定義函數(shù),常數(shù),結(jié)構(gòu)類(lèi)型及其他信息,有關(guān)這一部份的內(nèi)容都寫(xiě)入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;//撥號(hào)連接數(shù)組(假設(shè)最多有10個(gè)活動(dòng)的撥號(hào)連接)
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('斷開(kāi)失敗');
end
else
ShowMessage('斷開(kāi)成功');
end;
end;
unit rasapi;
interface
Uses WinTypes, WinProcs, Dialogs;
Const
UNLEN = 256;
PWLEN = 256;
DNLEN = 15;
RAS_MaxEntryName = 256;//連接名稱(chēng)最大長(zhǎng)度
RAS_MaxDeviceName = 128;//設(shè)備名稱(chēng)最大長(zhǎng)度
RAS_MaxDeviceType = 16;//設(shè)備類(lèi)型名稱(chēng)長(zhǎng)度
{ RAS_MaxParamKey = 32;
RAS_MaxParamValue = 128;}
RAS_MaxPhoneNumber = 128;//電話(huà)號(hào)碼的最大長(zhǎng)度
RAS_MaxCallbackNumber = RAS_MaxPhoneNumber;
Type
{UINT = Word;}
PHRASConn = ^HRASConn;
Type
{ 確認(rèn)一活動(dòng)的撥號(hào)連接. (為RasConnectEnum函數(shù)使用) }
PRASConn = ^TRASConn;//撥號(hào)連接的句柄類(lèi)型
TRASConn = record
dwSize: DWORD;//該結(jié)構(gòu)類(lèi)型所占內(nèi)存的字節(jié)大小
rasConn: HRASConn;//活動(dòng)連接的句柄
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;
//撥號(hào)函數(shù)
Function RasDial(
lpRasDialExtensions : PRASDIALEXTENSIONS ; //在WIN9X下無(wú)用,可設(shè)置為NIL
lpszPhonebook: PChar; //在WIN9X下無(wú)用,可設(shè)置為NIL
lpRasDialParams : PRASDIALPARAMS; // 撥號(hào)參數(shù),類(lèi)型指針
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 ; { 電話(huà)本名稱(chēng),在WIN9X下無(wú)用,可設(shè)置為NIL}
lprasentryname: PRASENTRYNAME ; {接收撥號(hào)連接名稱(chēng)的緩沖區(qū),是一類(lèi)型數(shù)組的指針}
var lpcb : DWORD; {接收撥號(hào)連接名稱(chēng)的緩沖區(qū)的大小}
var lpcEntries : DWORD {實(shí)際獲得撥號(hào)連接 的數(shù)目}
) : DWORD; stdcall;
function RasGetConnectStatus(RASConn: hrasConn; { 指定活動(dòng)連接的句柄 }
RASConnStatus: PRASConnStatus { 獲取活動(dòng)連接狀態(tài)信息的緩沖區(qū)}
): LongInt; stdcall;
function RasGetErrorString(ErrorCode: DWord; { 錯(cuò)誤代碼標(biāo)識(shí)}
szErrorString: PChar; { 錯(cuò)誤提示信息的緩沖區(qū)}
BufSize: DWord {錯(cuò)誤提示信息的緩沖區(qū)的大小 }
): LongInt; stdcall;
function RasHangUp(RASConn: hrasConn ): LongInt; stdcall;
function RasGetEntryDialParams(
lpszPhonebook:PChar; {電話(huà)本名稱(chēng),在WIN9X下無(wú)用,可設(shè)置為NIL }
VAR lprasdialparams:TRASDIALPARAMS; {撥號(hào)參數(shù),是一類(lèi)型指針}
VAR lpfPassword : BOOL {顯示是否需要用戶(hù)密碼}
): 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環(huán)境下調(diào)試通過(guò)。