已创建的VPN连接,调用,断开

来源:互联网 发布:铋晶体价格淘宝 编辑:程序博客网 时间:2024/04/28 20:01

unit u_publicDefine;

interface

Uses WinTypes, WinProcs, Dialogs,SysUtils,Forms,Controls;
Const
   UNLEN = 256;
   PWLEN = 256;
   DNLEN = 15;
   RAS_MaxEntryName   = 256;//连接名称最大长度
   RAS_MaxDeviceName   = 128;//设备名称最大长度
   RAS_MaxDeviceType   = 16;//设备类型名称长度
   //RAS_MaxParamKey   = 32;
   //RAS_MaxParamValue   = 128;
   RAS_MaxPhoneNumber  = 128;//电话号码的最大长度
   RAS_MaxCallbackNumber = RAS_MaxPhoneNumber;
    RDEOPT_IgnoreModemSpeaker                 =   $00000004;

   Type
    HRASConn   =   DWORD;
   { 确认一活动的拨号连接. (为RasConnectEnum函数使用) }
   PRASConn = ^TRASConn;//拨号连接的句柄类型
   TRASConn = record
   dwSize: DWORD;//该结构类型所占内存的字节大小
   rasConn: HRASConn;//活动连接的句柄
   szEntryName: Array[0..RAS_MaxEntryName] Of Char;//
   szDeviceType : Array[0..RAS_MaxDeviceType] Of Char;
   szDeviceName : Array [0..RAS_MaxDeviceName] of char;
   end;

   PRASConnStatus = ^TRASConnStatus;
   TRASConnStatus = Record
   dwSize: LongInt;
   rasConnstate: Word;
   dwError: LongInt;
   szDeviceType: Array[0..RAS_MaxDeviceType] Of Char;
   szDeviceName: Array[0..RAS_MaxDeviceName] Of Char;
   End;

   PRASDIALEXTENSIon__S= ^TRASDIALEXTENSION__S;
   TRASDIALEXTENSIon__S= Record
   dwSize: DWORD;
   dwfOptions: DWORD;
   hwndParent: HWnd;
   reserved: DWORD;
   end;

   PRASDialParams = ^TRASDialParams;
   TRASDialParams = Record
   dwSize: DWORD;
   szEntryName: Array[0..RAS_MaxEntryName] Of Char;
   szPhoneNumber: Array[0..RAS_MaxPhoneNumber] Of Char;
   szCallbackNumber: Array[0..RAS_MaxCallbackNumber] Of Char;
   szUserName: Array[0..UNLEN] Of Char;
   szPassword: Array[0..PWLEN] Of Char;
   szDomain: Array[0..DNLEN] Of Char;
   end;

   PRASEntryName = ^TRASEntryName;
   TRASEntryName = Record
   dwSize: LongInt;
   szEntryName: Array[0..RAS_MaxEntryName] Of Char;
   {Reserved: Byte;}
   End;

   //拨号函数

Function RasDial(
   lpRasDialExtensions : PRASDIALEXTENSION__S ; //在WIN9X下无用,可设置为NIL
   lpszPhonebook: PChar; //在WIN9X下无用,可设置为NIL
   lpRasDialParams : PRASDIALPARAMS; // 拨号参数,类型指针
   dwNotifierType : DWORD;   { 消息通知方式}
   lpvNotifier: DWORD;  { 消息处理事件}
   var rasConn: HRASConn   { 返回成功连接的连接句柄}
   ): DWORD; stdcall;

Function RasEnumConnections(RASConn: PrasConn;
   var BufSize: DWord;
   var Connections: DWord): LongInt; stdcall;

Function RasEnumEntries (
   reserved: PChar;  {保留字段,必须为空}
   lpszPhonebook: PChar;   { 电话本名称,在WIN9X下无用,可设置为NIL}
   lprasentryname: PRASENTRYNAME;  {接收拨号连接名称的缓冲区,是一类型数组的指针}
   var lpcb :   DWORD; {接收拨号连接名称的缓冲区的大小}
   var lpcEntries : DWORD  {实际获得拨号连接 的数目}
   ) : DWORD; stdcall;

Function RasGetConnectStatus(RASConn: hrasConn;  { 指定活动连接的句柄 }
   RASConnStatus: PRASConnStatus { 获取活动连接状态信息的缓冲区}
   ): LongInt; stdcall;

Function RasGetErrorString(ErrorCode: DWord;  { 错误代码标识}
   szErrorString: PChar;  { 错误提示信息的缓冲区}
   BufSize: DWord   {错误提示信息的缓冲区的大小 }
   ): LongInt; stdcall;

Function RasHangUp(RASConn: hrasConn ): LongInt; stdcall;

Function RasGetEntryDialParams(
   lpszPhonebook:PChar;  {电话本名称,在WIN9X下无用,可设置为NIL }
   VAR lprasdialparams:TRASDIALPARAMS; {拨号参数,是一类型指针}
   VAR lpfPassword : BOOL  {显示是否需要用户密码}
   ): DWORD; stdcall;

   function ConnectionToInterNet(const VpnName,UserName,Password,Phone,Domain:string;bSpeaker:Boolean=False):Boolean;
   Function Disconnection():Boolean;
implementation

const
   RAS_DLL = 'RASAPI32';

Function RasDial; external RAS_DLL name 'RasDialA';
Function RasEnumConnections; external RAS_DLL name 'RasEnumConnectionsA';
Function RasEnumEntries; external RAS_DLL name 'RasEnumEntriesA';
Function RasGetConnectStatus; external RAS_DLL name 'RasGetConnectStatusA';
Function RasGetErrorString; external RAS_DLL name 'RasGetErrorStringA';
Function RasHangUp; external RAS_DLL name 'RasHangUpA';
Function RasGetEntryDialParams; external RAS_DLL name 'RasGetEntryDialParamsA';

 ////////////////////////////
 ///功能:连接VPN
 ///输入参数:
 ///    1、VpnName VPN名称
 ///    2、UserName 用户名
 ///    3、Password 密码
 ///    4、Phone 电话号码(应该为空)
 ///    5、Domain 域
 ///    6、bSpeaker 忽略拨号音
 ///返回参数:为空则连接成功,否则连接失败
 ////////////////////////////
function ConnectionToInterNet(const VpnName,UserName,Password,Phone,Domain:string;bSpeaker:Boolean=False):Boolean;
var
  hRas:   HRasConn;
  DialParams:   PRasDialParams;
  Extensions:   PRASDialExtension__s;
  Value:   Integer;
  C:   array   [0..255]   of   Char;
begin
  Screen.Cursor:=crHourglass;
  Result:=False;
  New(DialParams);
  try
    Extensions:=nil;
    if Not bSpeaker   then     {忽略拨号音}
    begin
      New(Extensions);
      Extensions^.dwSize  :=  SizeOf(TRASDialExtension__s);
      Extensions^.dwfOptions  := RDEOPT_IgnoreModemSpeaker;
    end;
    FillChar(Dialparams^,   SizeOf(TRasDialParams), 0);
    with   Dialparams^   do
    begin
      dwSize  :=  Sizeof(TRasDialParams);
      StrPCopy(szEntryName,VpnName);
      StrPCopy(szUserName,UserName);
      StrPCopy(szPassword,Password);
      //StrPCopy(szPhoneNumber,Phone);
      if Domain<>'' then StrPCopy(szDomain,   Domain);
    end;
    hRas  :=  0;
    Value := RasDial(Extensions,nil,dialparams,0,0,hRas);
    if Value <> 0 then
    begin
      Result  :=  False;
      RasGetErrorString(Value,C,255);
      RasHangUp(hRas);
      ShowMessage('VPN连接失败,错误信息如下:'+  string(C));
    end;
    if not bSpeaker then dispose(Extensions);
  finally
    Dispose(DialParams);
    Result := Value = 0;
    Screen.Cursor  :=  crDefault;
  end;
end;

 ////////////////////////////
 ///功能:断开VPN
 ///
 ///返回参数:为空则连接成功,否则连接失败
 ////////////////////////////
Function Disconnection():Boolean;
var
   conn:array[0..100] of TRASConn;
   c,S :Dword;
   i,j:integer;
   state : TRASConnStatus;
   P :PRASConn;
   H : HRASConn;
begin
   Result:=True;
   conn[1].dwSize := SIZEOF(TRasConn);
   c := SIZEOF(TRasConn)*100;
   FillChar(state,sizeof(TRasConnStatus),100);
   state.dwSize := sizeof(TRasConnStatus);
   if RasEnumConnections(@conn[1],c,S) = 0 then
   begin
     if  s > 0 then
     with conn[1] do
     begin
        P := pointer(rasconn);
        H := Longint(P);
        if RasHangUp(H) <> 0 then
        begin
          Result:=False;
          ShowMessage('VPN断开连接失败');
        end
        //else ShowMessage('断开成功');
     end;
   end;
end;


end.
end.

原创粉丝点击