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