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('拨号连接的名称','用户名','密码');


谢祥选【小宇飞刀(xieyunc)】