博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RasAPI函数实现PPPOE拨号
阅读量:4356 次
发布时间:2019-06-07

本文共 7631 字,大约阅读时间需要 25 分钟。

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

转载于:https://www.cnblogs.com/xieyunc/p/4438276.html

你可能感兴趣的文章
fdisk分区和挂载
查看>>
2019春第八周作业
查看>>
AsyncTask和Handler两种异步方式的实现和区别比较
查看>>
wordpress搬迁后内页显示链接错误解决办法
查看>>
制造行业流程管理的“IPO”思维
查看>>
Android PhotoView基本功能实现
查看>>
类中的变量
查看>>
LeetCode 98. 验证二叉搜索树
查看>>
Kali Linux Web渗透测试手册(第二版) - 3.2 - 使用ZAP寻找敏感文件和目录
查看>>
Python入门 学习笔记 (一)
查看>>
ArrayList简单实现代码,欢迎大家指点
查看>>
Android开发手记(30) 触摸及手势操作
查看>>
Python------类的结构细分,异常处理,方法,属性
查看>>
41.内存函数实现(memcpy,memset,memmove,memicmp,memchr.memccpy)
查看>>
环形队列的c++实现
查看>>
扩展欧几里德算法求不定方程
查看>>
软件项目托管平台
查看>>
Oracle :多表更新多个字段
查看>>
Programming Languages - Coursera 整理
查看>>
ASP.NET MVC 3 入门级常用设置、技巧和报错
查看>>