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.
|