RasAPI函数实现PPPOE拨号

时间:2022-06-01 19:34:45
unit uDial;

  interface
uses
Windows,Messages, SysUtils, Ras;// Classes; var
//EntryName,UserName,PassWord:string; nRasConnCount: DWORD;
aRasConn:array [0..10] of TRASCONN;
hRasConn:THRASCONN;
IsConnected:boolean;
RasDialConEnd:boolean;
RasError:string; function Dial(FEntryName, FUserName, FPassword : String):integer;
procedure Disconnected;
function GetIP:string;
implementation procedure Disconnected;//断开连接 begin
try
if hRasConn <> 0 then
begin
RasHangUp(hRasConn);
hRasConn:= 0;
end;
except
end;
end; function GetActiveConn:string; //读取活动连接 var
dwRet : DWORD;
nCB : DWORD;
Buf : array [0..255] of Char;
begin
try
aRasConn[0].dwSize := SizeOf(aRasConn[0]);
nCB := SizeOf(aRasConn);
dwRet := RasEnumConnections(@aRasConn, @nCB, @nRasConnCount);//枚举活动连接 if dwRet <> 0 then begin
RasGetErrorString(dwRet, @Buf[0], SizeOf(Buf));
result:=Buf;
end
else result:='';
except
end;
end; function GetActiveConnHandle(szName : String) : THRASCONN; //读取活动连接的句柄 var
I : Integer;
begin
GetActiveConn;
if nRasConnCount > 0 then begin
for I := 0 to nRasConnCount - 1 do begin
if StrIComp(PChar(szName), aRasConn[I].szEntryName) = 0 then begin
Result := aRasConn[I].hRasConn;
Exit;
end;
end;
end;
Result := 0;
end; function CheckConn(FEntryName:string):boolean; //检测是否已经连接 begin
hRasConn := GetActiveConnHandle(FEntryName);
if hRasConn <> 0 then
result:=True
else
Result:=False;
end; function GetIP:string;
begin
result:=RasGetIPAddress;
if result='' then result :='Unknow';
end; //回调函数 procedure RasDialFunc(unMsg : DWORD;FRasConnState : TRASCONNSTATE;FdwError : DWORD); stdcall;
var
Buf: array [0..255] of Char;
ConnState:string;
begin
try
ConnState:=RasConnectionStateToString(FRasConnState); //连接状态 if FRasConnState = RASCS_Connected then
begin //连接成功 IsConnected:=true;
RasDialConEnd:=true;
end
else if FdwError<>0 then //连接出错 begin
RasGetErrorString(FdwError, @Buf[0], SizeOf(Buf));
RasError:=(Buf);
Disconnected;
IsConnected:=false;
RasDialConEnd:=true;
end;
except
end; end; function Dial(FEntryName, FUserName, FPassword : String):integer;//拨号连接 {type TDialThread=class(TThread)
private
public
constructor Create;
procedure Execute; override;
end;
constructor TDialThread.Create;
begin
inherited Create(false); //false 创建后立即执行 FreeOnTerminate:=true; //true 自动结束线程 end; procedure TDialThread.Execute;
begin
while Not RasDialConEnd do
begin
sleep(100);
end;
end;
}
var
rdParams : TRASDIALPARAMS;
dwRet : DWORD;
Buf : array [0..255] of Char;
//thDial : TDialThread; begin
result:=0;
try
hRasConn := GetActiveConnHandle(FEntryName);
if hRasConn <> 0 then //已经在连接中 begin
IsConnected:=true;
RasDialConEnd:=true;
Exit;
end; // setup RAS Dial Parameters FillChar(rdParams, SizeOf(rdParams), 0);
rdParams.dwSize := SizeOf(TRASDIALPARAMS);
strCopy(rdParams.szUserName, PChar(FUserName));
strCopy(rdParams.szPassword, PChar(FPassword));
strCopy(rdParams.szEntryName, PChar(FEntryName));
rdParams.szPhoneNumber[0] := #0;
rdParams.szCallbackNumber[0] := '*';
rdParams.szDomain := '*'; hRasConn := 0;RasDialConEnd:=false;
dwRet := RasDial(nil, nil, @rdParams, 0, @RasDialFunc, @hRasConn);
result:=integer(dwRet);
if dwRet <> 0 then
begin
RasGetErrorString(dwRet, @Buf[0], SizeOf(Buf));
RasError:=(IntToStr(dwRet) + ' ' + Buf);
Disconnected;
end
else;
except
end;
end; function DisconnectActiveConnection: Boolean;//断开活动的连接 const
MaxConnections = 10;//假设最多有10个活动的拨号连接 var
connections : array[0..MaxConnections-1] of TRASCONN;
//拨号连接数组 longSize : dword;
intAvailabelConnections : dword;
//活动的拨号连接的实际数目 intIndex : integer;
strTemp : string;
dwResult : DWORD;
dwSize : DWORD;
RASpppIP : TRASPPPIP;
//活动的拨号连接的动态IP地址信息 begin
connections[ 0 ].dwSize := sizeof(TRASCONN);
longSize := MaxConnections * connections[ 0 ].dwSize;
//接收活动连接的缓冲区大小 intAvailabelConnections := 0;
//获取所有活动的拨号连接的信息(连接句柄和设置信息) dwResult := RasEnumConnections( @connections[ 0 ],@longSize,@intAvailabelConnections );
if 0 = dwResult then
begin
//form1.memo1.lines.add( '现有的活动连接有' +IntToStr( intAvailabelConnections ) + '个'); //显示所有活动的拨号连接的信息(设置信息和动态IP地址) for intIndex := 0 to intAvailabelConnections - 1 do
begin
//显示一个活动的拨号连接的设置信息 //strTemp := '连接名称:'+ StrPAS( connections[ intIndex ].szEntryName )+ ',设备类型:'+ StrPAS( connections[ intIndex ].szDeviceType )+ ',设备名称:'+ StrPAS( connections[ intIndex ].szDeviceName ); //form1.memo1.lines.add( strTemp ); //显示一个活动的拨号连接的动态IP地址 dwSize := SizeOf(RASpppIP);
RASpppIP.dwSize := dwSize;
dwResult := RASGetProjectionInfo( connections[ intIndex ].hRasConn,RASP_PppIp,@RasPPPIP,@dwSize);//获取动态IP地址 {if 0 <> dwResult then
form1.memo1.lines.add('错误:' + inttostr( dwResult ))
else
form1.memo1.lines.add('动态地址:' + StrPas(RASpppIP.szIPAddress));
}
RasHangUp(connections[ intIndex ].hRasConn);
{if RasHangUp(connections[ intIndex ].hRasConn)=0 then
form1.memo1.lines.add('断开连接成功')
else
form1.memo1.lines.add('断开连接失败');
}
end;
end;
end; end.

调用方法

mRet:=Dial('拨号连接的名称','用户名','密码');