zoukankan      html  css  js  c++  java
  • RasAPI函数实现PPPOE拨号

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


  • 相关阅读:
    25个可遇不可求的jQuery插件
    微网站|h5弹窗|手机网站 html5 弹窗、弹层、提示框、加载条
    逻辑设计--每一层的验证策略
    [傅里叶变换及其应用学习笔记] 八. 时延性,尺度变化,卷积
    [傅里叶变换及其应用学习笔记] 七. 傅里叶正(反)变换复习
    [傅里叶变换及其应用学习笔记] 六. 热方程讨论
    [傅里叶变换及其应用学习笔记] 五. 傅里叶级数连续性讨论,热方程
    [傅里叶变换及其应用学习笔记] 四. 傅里叶级数
    [傅里叶变换及其应用学习笔记] 三. 复习,将一般周期函数表示成简单周期函数和
    [傅里叶变换及其应用学习笔记] 二. 周期性,三角函数表示复杂函数
  • 原文地址:https://www.cnblogs.com/xieyunc/p/9126570.html
Copyright © 2011-2022 走看看