首页  编辑  

DialUp

Tags: /超级猛料/Network.网络通讯/FTP和拨号/   Date Created:

(****************************************** |******************************************

*  DIALUP, telefonicke pripojeni site    * |*  DIALUP, dial-up networking component  *

*     komponenta pro Delphi 3 (32b)      * |*                for Delphi 3 (32b)      *

*                 (c) 1998 BEALsoft      * |*                 (c) 1998 BEALsoft      *

*                       v1.0             * |*                       v1.0             *

*________________________________________* |*________________________________________*

*    !! TATO KOMPONENTA JE ZDARMA !!     * |*     !! THIS COMPONENT IS FREE !!       *

****************************************** |******************************************)

// Kontakt na autora // Contact to author :

// aberka@usa.net, ICQ UIN 2365308, http://members.xoom.com/aberka

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

// See README.TXT for details, description of properties and methods

// Prectete si CTIMNE.TXT, kde jsou popsany vsechny dulezite funkce a vlastnosti

// Thanx to Davide Moretti for his RAS API header (Some code in this component

//  was written by him). You can reach him via e-mail: dmoretti@iper.net

unit DialUp;

interface

uses

 SysUtils, Windows, Dialogs, Classes, ExtCtrls, Forms, Messages;

{******************************************************}

{******************************************************}

{******************************************************}

// RAS API header by Davide Moretti

{******************************************************}

{******************************************************}

{******************************************************}

(*RASAPI*){* Copyright (c) 1992-1995, Microsoft Corporation, all rights reserved

(*RASAPI*)**

(*RASAPI*)** ras.h

(*RASAPI*)** Remote Access external API

(*RASAPI*)** Public header for external API clients

(*RASAPI*)*}

(*RASAPI*)

(*RASAPI*){ Delphi conversion by Davide Moretti <dmoretti@iper.net> }

(*RASAPI*){ Note: All functions and structures defaults to Ansi. If you want to use

(*RASAPI*)  Unicode structs and funcs, use the names ending with 'W' }

(*RASAPI*)

(*RASAPI*)const

(*RASAPI*){ These are from lmcons.h }

(*RASAPI*)  DNLEN            = 15;  // Maximum domain name length

(*RASAPI*)  UNLEN            = 256; // Maximum user name length

(*RASAPI*)  PWLEN            = 256; // Maximum password length

(*RASAPI*)  NETBIOS_NAME_LEN = 16;  // NetBIOS net name (bytes)

(*RASAPI*)

(*RASAPI*)  RAS_MaxDeviceType     = 16;

(*RASAPI*)  RAS_MaxPhoneNumber    = 128;

(*RASAPI*)  RAS_MaxIpAddress      = 15;

(*RASAPI*)  RAS_MaxIpxAddress     = 21;

(*RASAPI*)  RAS_MaxEntryName      = 256;

(*RASAPI*)  RAS_MaxDeviceName     = 128;

(*RASAPI*)  RAS_MaxCallbackNumber = RAS_MaxPhoneNumber;

(*RASAPI*)

(*RASAPI*)type

(*RASAPI*)  LPHRasConn = ^THRasConn;

(*RASAPI*)  THRasConn  = Longint;

(*RASAPI*)

(*RASAPI*){* Identifies an active RAS connection.  (See RasEnumConnections) *}

(*RASAPI*)  LPRasConnW = ^TRasConnW;

(*RASAPI*)  TRasConnW  = record

(*RASAPI*)    dwSize       : Longint;

(*RASAPI*)    hrasconn     : THRasConn;

(*RASAPI*)    szEntryName  : Array[0..RAS_MaxEntryName] of WideChar;

(*RASAPI*)    szDeviceType : Array[0..RAS_MaxDeviceType] of WideChar;

(*RASAPI*)    szDeviceName : Array[0..RAS_MaxDeviceName] of WideChar;

(*RASAPI*)  end;

(*RASAPI*)

(*RASAPI*)  LPRasConnA = ^TRasConnA;

(*RASAPI*)  TRasConnA  = record

(*RASAPI*)    dwSize       : Longint;

(*RASAPI*)    hrasconn     : THRasConn;

(*RASAPI*)    szEntryName  : Array[0..RAS_MaxEntryName] of AnsiChar;

(*RASAPI*)    szDeviceType : Array[0..RAS_MaxDeviceType] of AnsiChar;

(*RASAPI*)    szDeviceName : Array[0..RAS_MaxDeviceName] of AnsiChar;

(*RASAPI*)  end;

(*RASAPI*)

(*RASAPI*)  LPRasConn = ^TRasConn;

(*RASAPI*)  TRasConn  = TRasConnA;

(*RASAPI*)

(*RASAPI*)const

(*RASAPI*){* Enumerates intermediate states to a connection.  (See RasDial) *}

(*RASAPI*)  RASCS_PAUSED = $1000;

(*RASAPI*)  RASCS_DONE   = $2000;

(*RASAPI*)

(*RASAPI*)type

(*RASAPI*)  LPRasConnState = ^TRasConnState;

(*RASAPI*)  TRasConnState  = Integer;

(*RASAPI*)

(*RASAPI*)const

(*RASAPI*)  RASCS_OpenPort                  = 0;

(*RASAPI*)  RASCS_PortOpened                = 1;

(*RASAPI*)  RASCS_ConnectDevice             = 2;

(*RASAPI*)  RASCS_DeviceConnected           = 3;

(*RASAPI*)  RASCS_AllDevicesConnected       = 4;

(*RASAPI*)  RASCS_Authenticate              = 5;

(*RASAPI*)  RASCS_AuthNotify                = 6;

(*RASAPI*)  RASCS_AuthRetry                 = 7;

(*RASAPI*)  RASCS_AuthCallback              = 8;

(*RASAPI*)  RASCS_AuthChangePassword        = 9;

(*RASAPI*)  RASCS_AuthProject               = 10;

(*RASAPI*)  RASCS_AuthLinkSpeed             = 11;

(*RASAPI*)  RASCS_AuthAck                   = 12;

(*RASAPI*)  RASCS_ReAuthenticate            = 13;

(*RASAPI*)  RASCS_Authenticated             = 14;

(*RASAPI*)  RASCS_PrepareForCallback        = 15;

(*RASAPI*)  RASCS_WaitForModemReset         = 16;

(*RASAPI*)  RASCS_WaitForCallback           = 17;

(*RASAPI*)  RASCS_Projected                 = 18;

(*RASAPI*)  RASCS_StartAuthentication       = 19;

(*RASAPI*)  RASCS_CallbackComplete          = 20;

(*RASAPI*)  RASCS_LogonNetwork              = 21;

(*RASAPI*)

(*RASAPI*)  RASCS_Interactive               = RASCS_PAUSED;

(*RASAPI*)  RASCS_RetryAuthentication       = RASCS_PAUSED + 1;

(*RASAPI*)  RASCS_CallbackSetByCaller       = RASCS_PAUSED + 2;

(*RASAPI*)  RASCS_PasswordExpired           = RASCS_PAUSED + 3;

(*RASAPI*)

(*RASAPI*)  RASCS_Connected                 = RASCS_DONE;

(*RASAPI*)  RASCS_Disconnected              = RASCS_DONE + 1;

(*RASAPI*)

(*RASAPI*)type

(*RASAPI*){* Describes the status of a RAS connection.  (See RasConnectionStatus)*}

(*RASAPI*)  LPRasConnStatusW = ^TRasConnStatusW;

(*RASAPI*)  TRasConnStatusW  = record

(*RASAPI*)    dwSize         : Longint;

(*RASAPI*)    rasconnstate   : TRasConnState;

(*RASAPI*)    dwError        : LongInt;

(*RASAPI*)    szDeviceType   : Array[0..RAS_MaxDeviceType] of WideChar;

(*RASAPI*)    szDeviceName   : Array[0..RAS_MaxDeviceName] of WideChar;

(*RASAPI*)  end;

(*RASAPI*)

(*RASAPI*)  LPRasConnStatusA = ^TRasConnStatusA;

(*RASAPI*)  TRasConnStatusA  = record

(*RASAPI*)    dwSize         : Longint;

(*RASAPI*)    rasconnstate   : TRasConnState;

(*RASAPI*)    dwError        : LongInt;

(*RASAPI*)    szDeviceType   : Array[0..RAS_MaxDeviceType] of AnsiChar;

(*RASAPI*)    szDeviceName   : Array[0..RAS_MaxDeviceName] of AnsiChar;

(*RASAPI*)  end;

(*RASAPI*)

(*RASAPI*)  LPRasConnStatus = ^TRasConnStatus;

(*RASAPI*)  TRasConnStatus  = TRasConnStatusA;

(*RASAPI*)

(*RASAPI*){* Describes connection establishment parameters.  (See RasDial)*}

(*RASAPI*)  LPRasDialParamsW = ^TRasDialParamsW;

(*RASAPI*)  TRasDialParamsW  = record

(*RASAPI*)    dwSize           : LongInt;

(*RASAPI*)    szEntryName      : Array[0..RAS_MaxEntryName] of WideChar;

(*RASAPI*)    szPhoneNumber    : Array[0..RAS_MaxPhoneNumber] of WideChar;

(*RASAPI*)    szCallbackNumber : Array[0..RAS_MaxCallbackNumber] of WideChar;

(*RASAPI*)    szUserName       : Array[0..UNLEN] of WideChar;

(*RASAPI*)    szPassword       : Array[0..PWLEN] of WideChar;

(*RASAPI*)    szDomain         : Array[0..DNLEN] of WideChar;

(*RASAPI*)  end;

(*RASAPI*)

(*RASAPI*)  LPRasDialParamsA = ^TRasDialParamsA;

(*RASAPI*)  TRasDialParamsA  = record

(*RASAPI*)    dwSize           : LongInt;

(*RASAPI*)    szEntryName      : Array[0..RAS_MaxEntryName] of AnsiChar;

(*RASAPI*)    szPhoneNumber    : Array[0..RAS_MaxPhoneNumber] of AnsiChar;

(*RASAPI*)    szCallbackNumber : Array[0..RAS_MaxCallbackNumber] of AnsiChar;

(*RASAPI*)    szUserName       : Array[0..UNLEN] of AnsiChar;

(*RASAPI*)    szPassword       : Array[0..PWLEN] of AnsiChar;

(*RASAPI*)    szDomain         : Array[0..DNLEN] of AnsiChar;

(*RASAPI*)  end;

(*RASAPI*)

(*RASAPI*)  LPRasDialParams = ^TRasDialParams;

(*RASAPI*)  TRasDialParams  = TRasDialParamsA;

(*RASAPI*)

(*RASAPI*){* Describes extended connection establishment options.  (See RasDial)*}

(*RASAPI*)  LPRasDialExtensions = ^TRasDialExtensions;

(*RASAPI*)  TRasDialExtensions  = record

(*RASAPI*)    dwSize            : LongInt;

(*RASAPI*)    dwfOptions        : LongInt;

(*RASAPI*)    hwndParent        : HWND;

(*RASAPI*)    reserved          : LongInt;

(*RASAPI*)  end;

(*RASAPI*)

(*RASAPI*)const

(*RASAPI*){* 'dwfOptions' bit flags.*}

(*RASAPI*)  RDEOPT_UsePrefixSuffix           = $00000001;

(*RASAPI*)  RDEOPT_PausedStates              = $00000002;

(*RASAPI*)  RDEOPT_IgnoreModemSpeaker        = $00000004;

(*RASAPI*)  RDEOPT_SetModemSpeaker           = $00000008;

(*RASAPI*)  RDEOPT_IgnoreSoftwareCompression = $00000010;

(*RASAPI*)  RDEOPT_SetSoftwareCompression    = $00000020;

(*RASAPI*)

(*RASAPI*)

(*RASAPI*)type

(*RASAPI*)

(*RASAPI*){* Describes an enumerated RAS phone book entry name.  (See RasEntryEnum)*}

(*RASAPI*)  LPRasEntryNameW = ^TRasEntryNameW;

(*RASAPI*)  TRasEntryNameW  = record

(*RASAPI*)    dwSize        : Longint;

(*RASAPI*)    szEntryName   : Array[0..RAS_MaxEntryName] of WideChar;

(*RASAPI*)  end;

(*RASAPI*)

(*RASAPI*)  LPRasEntryNameA = ^TRasEntryNameA;

(*RASAPI*)  TRasEntryNameA  = record

(*RASAPI*)    dwSize        : Longint;

(*RASAPI*)    szEntryName   : Array[0..RAS_MaxEntryName] of AnsiChar;

(*RASAPI*)  end;

(*RASAPI*)

(*RASAPI*)  LPRasEntryName = ^TRasEntryName;

(*RASAPI*)  TRasEntryName  = TRasEntryNameA;

(*RASAPI*)

(*RASAPI*){* Protocol code to projection data structure mapping.*}

(*RASAPI*)  LPRasProjection = ^TRasProjection;

(*RASAPI*)  TRasProjection  = Integer;

(*RASAPI*)

(*RASAPI*)const

(*RASAPI*)  RASP_Amb        = $10000;

(*RASAPI*)  RASP_PppNbf     = $803F;

(*RASAPI*)  RASP_PppIpx     = $802B;

(*RASAPI*)  RASP_PppIp      = $8021;

(*RASAPI*)

(*RASAPI*)

(*RASAPI*)type

(*RASAPI*){* Describes the result of a RAS AMB (Authentication Message Block)

(*RASAPI*)** projection.  This protocol is used with NT 3.1 and OS/2 1.3 downlevel

(*RASAPI*)** RAS servers.*}

(*RASAPI*)  LPRasAmbW = ^TRasAmbW;

(*RASAPI*)  TRasAmbW  = record

(*RASAPI*)    dwSize         : Longint;

(*RASAPI*)    dwError        : Longint;

(*RASAPI*)    szNetBiosError : Array[0..NETBIOS_NAME_LEN] of WideChar;

(*RASAPI*)    bLana          : Byte;

(*RASAPI*)  end;

(*RASAPI*)

(*RASAPI*)  LPRasAmbA = ^TRasAmbA;

(*RASAPI*)  TRasAmbA  = record

(*RASAPI*)    dwSize         : Longint;

(*RASAPI*)    dwError        : Longint;

(*RASAPI*)    szNetBiosError : Array[0..NETBIOS_NAME_LEN] of AnsiChar;

(*RASAPI*)    bLana          : Byte;

(*RASAPI*)  end;

(*RASAPI*)

(*RASAPI*)  LPRasAmb = ^TRasAmb;

(*RASAPI*)  TRasAmb  = TRasAmbA;

(*RASAPI*)

(*RASAPI*){* Describes the result of a PPP NBF (NetBEUI) projection.*}

(*RASAPI*)  LPRasPppNbfW = ^TRasPppNbfW;

(*RASAPI*)  TRasPppNbfW  = record

(*RASAPI*)    dwSize             : Longint;

(*RASAPI*)    dwError            : Longint;

(*RASAPI*)    dwNetBiosError     : Longint;

(*RASAPI*)    szNetBiosError     : Array[0..NETBIOS_NAME_LEN] of WideChar;

(*RASAPI*)    szWorkstationName  : Array[0..NETBIOS_NAME_LEN] of WideChar;

(*RASAPI*)    bLana              : Byte;

(*RASAPI*)  end;

(*RASAPI*)

(*RASAPI*)  LPRasPppNbfA = ^TRasPppNbfA;

(*RASAPI*)  TRasPppNbfA  = record

(*RASAPI*)    dwSize             : Longint;

(*RASAPI*)    dwError            : Longint;

(*RASAPI*)    dwNetBiosError     : Longint;

(*RASAPI*)    szNetBiosError     : Array[0..NETBIOS_NAME_LEN] of AnsiChar;

(*RASAPI*)    szWorkstationName  : Array[0..NETBIOS_NAME_LEN] of AnsiChar;

(*RASAPI*)    bLana              : Byte;

(*RASAPI*)  end;

(*RASAPI*)

(*RASAPI*)  LpRaspppNbf = ^TRasPppNbf;

(*RASAPI*)  TRasPppNbf  = TRasPppNbfA;

(*RASAPI*)

(*RASAPI*){* Describes the results of a PPP IPX (Internetwork Packet Exchange)

(*RASAPI*)** projection.*}

(*RASAPI*)  LPRasPppIpxW = ^TRasPppIpxW;

(*RASAPI*)  TRasPppIpxW  = record

(*RASAPI*)    dwSize       : Longint;

(*RASAPI*)    dwError      : Longint;

(*RASAPI*)    szIpxAddress : Array[0..RAS_MaxIpxAddress] of WideChar;

(*RASAPI*)  end;

(*RASAPI*)

(*RASAPI*)  LPRasPppIpxA = ^TRasPppIpxA;

(*RASAPI*)  TRasPppIpxA  = record

(*RASAPI*)    dwSize       : Longint;

(*RASAPI*)    dwError      : Longint;

(*RASAPI*)    szIpxAddress : Array[0..RAS_MaxIpxAddress] of AnsiChar;

(*RASAPI*)  end;

(*RASAPI*)

(*RASAPI*)  LPRasPppIpx = ^TRasPppIpx;

(*RASAPI*)  TRasPppIpx  = TRasPppIpxA;

(*RASAPI*)

(*RASAPI*){* Describes the results of a PPP IP (Internet) projection.*}

(*RASAPI*)  LPRasPppIpW = ^TRasPppIpW;

(*RASAPI*)  TRasPppIpW  = record

(*RASAPI*)    dwSize      : Longint;

(*RASAPI*)    dwError     : Longint;

(*RASAPI*)    szIpAddress : Array[0..RAS_MaxIpAddress] of WideChar;

(*RASAPI*)

(*RASAPI*){$IFNDEF WINNT35COMPATIBLE}

(*RASAPI*)    {* This field was added between Windows NT 3.51 beta and Windows NT 3.51

(*RASAPI*)    ** final, and between Windows 95 M8 beta and Windows 95 final.  If you do

(*RASAPI*)    ** not require the server address and wish to retrieve PPP IP information

(*RASAPI*)    ** from Windows NT 3.5 or early Windows NT 3.51 betas, or on early Windows

(*RASAPI*)    ** 95 betas, define WINNT35COMPATIBLE.

(*RASAPI*)    **

(*RASAPI*)    ** The server IP address is not provided by all PPP implementations,

(*RASAPI*)    ** though Windows NT server's do provide it.    *}

(*RASAPI*)    szServerIpAddress: Array[0..RAS_MaxIpAddress] of WideChar;

(*RASAPI*){$ENDIF}

(*RASAPI*)  end;

(*RASAPI*)

(*RASAPI*)  LPRasPppIpA = ^TRasPppIpA;

(*RASAPI*)  TRasPppIpA  = record

(*RASAPI*)    dwSize      : Longint;

(*RASAPI*)    dwError     : Longint;

(*RASAPI*)    szIpAddress : Array[0..RAS_MaxIpAddress] of AnsiChar;

(*RASAPI*)

(*RASAPI*){$IFNDEF WINNT35COMPATIBLE} {* See RASPPPIPW comment. *}

(*RASAPI*)    szServerIpAddress: Array[0..RAS_MaxIpAddress] of AnsiChar;

(*RASAPI*){$ENDIF}

(*RASAPI*)  end;

(*RASAPI*)

(*RASAPI*)  LPRasPppIp = ^TRasPppIp;

(*RASAPI*)  TRasPppIp  = TRasPppIpA;

(*RASAPI*)

(*RASAPI*)

(*RASAPI*)const

(*RASAPI*){* If using RasDial message notifications, get the notification message code

(*RASAPI*)** by passing this string to the RegisterWindowMessageA() API.

(*RASAPI*)** WM_RASDIALEVENT is used only if a unique message cannot be registered.*}

(*RASAPI*)  RASDIALEVENT    = 'RasDialEvent';

(*RASAPI*)  WM_RASDIALEVENT = $CCCD;

(*RASAPI*)

(*RASAPI*)

(*RASAPI*){* Prototypes for caller's RasDial callback handler.  Arguments are the

(*RASAPI*)** message ID (currently always WM_RASDIALEVENT), the current RASCONNSTATE and

(*RASAPI*)** the error that has occurred (or 0 if none).  Extended arguments are the

(*RASAPI*)** handle of the RAS connection and an extended error code.

(*RASAPI*)*}

(*RASAPI*){

(*RASAPI*)typedef VOID (WINAPI *RASDIALFUNC)( UINT, RASCONNSTATE, DWORD );

(*RASAPI*)typedef VOID (WINAPI *RASDIALFUNC1)( HRASCONN, UINT, RASCONNSTATE, DWORD, DWORD );

(*RASAPI*)

(*RASAPI*)For Delphi: Just define the callback as

(*RASAPI*)procedure RASCallback(msg: Integer; state: TRasConnState;

(*RASAPI*)    dwError: Longint); stdcall;

(*RASAPI*) or

(*RASAPI*)procedure RASCallback1(hConn: THRasConn; msg: Integer;

(*RASAPI*)    state: TRasConnState; dwError: Longint; dwEexterror: Longint); stdcall;

(*RASAPI*)}

(*RASAPI*)

(*RASAPI*){* External RAS API function prototypes.

(*RASAPI*)*}

(*RASAPI*){Note: for Delphi the function without 'A' or 'W' is the Ansi one

(*RASAPI*)  as on the other Delphi headers}

(*RASAPI*)

(*RASAPI*)function RasDialA(lpRasDialExt: LPRasDialExtensions; lpszPhoneBook: PAnsiChar;

(*RASAPI*)                  var params: TRasDialParamsA; dwNotifierType: Longint;

(*RASAPI*)                  lpNotifier: Pointer; var rasconn: THRasConn): Longint; stdcall;

(*RASAPI*)function RasDialW(lpRasDialExt: LPRasDialExtensions; lpszPhoneBook: PWideChar;

(*RASAPI*)                  var params: TRasDialParamsW; dwNotifierType: Longint;

(*RASAPI*)                  lpNotifier: Pointer; var rasconn: THRasConn): Longint; stdcall;

(*RASAPI*)function RasDial(lpRasDialExt: LPRasDialExtensions; lpszPhoneBook: PAnsiChar;

(*RASAPI*)                 var params: TRasDialParams; dwNotifierType: Longint;

(*RASAPI*)                 lpNotifier: Pointer; var rasconn: THRasConn): Longint; stdcall;

(*RASAPI*)

(*RASAPI*)function RasEnumConnectionsA(RasConnArray: LPRasConnA; var lpcb: Longint;

(*RASAPI*)                             var lpcConnections: Longint): Longint; stdcall;

(*RASAPI*)function RasEnumConnectionsW(RasConnArray: LPRasConnW; var lpcb: Longint;

(*RASAPI*)                             var lpcConnections: Longint): Longint; stdcall;

(*RASAPI*)function RasEnumConnections(RasConnArray: LPRasConn; var lpcb: Longint;

(*RASAPI*)                             var lpcConnections: Longint): Longint; stdcall;

(*RASAPI*)

(*RASAPI*)function RasEnumEntriesA(Reserved: PAnsiChar; lpszPhoneBook: PAnsiChar;

(*RASAPI*)                         entrynamesArray: LPRasEntryNameA; var lpcb: Longint;

(*RASAPI*)                         var lpcEntries: Longint): Longint; stdcall;

(*RASAPI*)function RasEnumEntriesW(reserved: PWideChar; lpszPhoneBook: PWideChar;

(*RASAPI*)                         entrynamesArray: LPRasEntryNameW; var lpcb: Longint;

(*RASAPI*)                         var lpcEntries: Longint): Longint; stdcall;

(*RASAPI*)function RasEnumEntries(reserved: PAnsiChar; lpszPhoneBook: PAnsiChar;

(*RASAPI*)                        entrynamesArray: LPRasEntryName; var lpcb: Longint;

(*RASAPI*)                        var lpcEntries: Longint): Longint; stdcall;

(*RASAPI*)

(*RASAPI*)function RasGetConnectStatusA(hConn: THRasConn; var lpStatus: TRasConnStatusA): Longint; stdcall;

(*RASAPI*)function RasGetConnectStatusW(hConn: THRasConn;var lpStatus: TRasConnStatusW): Longint; stdcall;

(*RASAPI*)function RasGetConnectStatus(hConn: THRasConn;var lpStatus: TRasConnStatus): Longint; stdcall;

(*RASAPI*)

(*RASAPI*)function RasGetErrorStringA(errorValue: Integer;erroString: PAnsiChar;cBufSize: Longint): Longint; stdcall;

(*RASAPI*)function RasGetErrorStringW(errorValue: Integer;erroString: PWideChar;cBufSize: Longint): Longint; stdcall;

(*RASAPI*)function RasGetErrorString(errorValue: Integer;erroString: PAnsiChar;cBufSize: Longint): Longint; stdcall;

(*RASAPI*)

(*RASAPI*)function RasHangUpA(hConn: THRasConn): Longint; stdcall;

(*RASAPI*)function RasHangUpW(hConn: THRasConn): Longint; stdcall;

(*RASAPI*)function RasHangUp(hConn: THRasConn): Longint; stdcall;

(*RASAPI*)

(*RASAPI*)function RasGetProjectionInfoA(hConn: THRasConn; rasproj: TRasProjection;

(*RASAPI*)                               lpProjection: Pointer; var lpcb: Longint): Longint; stdcall;

(*RASAPI*)function RasGetProjectionInfoW(hConn: THRasConn; rasproj: TRasProjection;

(*RASAPI*)                               lpProjection: Pointer; var lpcb: Longint): Longint; stdcall;

(*RASAPI*)function RasGetProjectionInfo(hConn: THRasConn; rasproj: TRasProjection;

(*RASAPI*)                              lpProjection: Pointer; var lpcb: Longint): Longint; stdcall;

(*RASAPI*)

(*RASAPI*)function RasCreatePhonebookEntryA(hwndParentWindow: HWND;lpszPhoneBook: PAnsiChar): Longint; stdcall;

(*RASAPI*)function RasCreatePhonebookEntryW(hwndParentWindow: HWND;lpszPhoneBook: PWideChar): Longint; stdcall;

(*RASAPI*)function RasCreatePhonebookEntry(hwndParentWindow: HWND;lpszPhoneBook: PAnsiChar): Longint; stdcall;

(*RASAPI*)

(*RASAPI*)function RasEditPhonebookEntryA(hwndParentWindow: HWND; lpszPhoneBook: PAnsiChar;

(*RASAPI*)                                lpszEntryName: PAnsiChar): Longint; stdcall;

(*RASAPI*)function RasEditPhonebookEntryW(hwndParentWindow: HWND; lpszPhoneBook: PWideChar;

(*RASAPI*)                                lpszEntryName: PWideChar): Longint; stdcall;

(*RASAPI*)function RasEditPhonebookEntry(hwndParentWindow: HWND; lpszPhoneBook: PAnsiChar;

(*RASAPI*)                               lpszEntryName: PAnsiChar): Longint; stdcall;

(*RASAPI*)

(*RASAPI*)function RasSetEntryDialParamsA(lpszPhoneBook: PAnsiChar; var lpDialParams: TRasDialParamsA;

(*RASAPI*)                                fRemovePassword: LongBool): Longint; stdcall;

(*RASAPI*)function RasSetEntryDialParamsW(lpszPhoneBook: PWideChar; var lpDialParams: TRasDialParamsW;

(*RASAPI*)                                fRemovePassword: LongBool): Longint; stdcall;

(*RASAPI*)function RasSetEntryDialParams(lpszPhoneBook: PAnsiChar; var lpDialParams: TRasDialParams;

(*RASAPI*)                               fRemovePassword: LongBool): Longint; stdcall;

(*RASAPI*)

(*RASAPI*)function RasGetEntryDialParamsA(lpszPhoneBook: PAnsiChar; var lpDialParams: TRasDialParamsA;

(*RASAPI*)                                var lpfPassword: LongBool): Longint; stdcall;

(*RASAPI*)function RasGetEntryDialParamsW(lpszPhoneBook: PWideChar; var lpDialParams: TRasDialParamsW;

(*RASAPI*)                                var lpfPassword: LongBool): Longint; stdcall;

(*RASAPI*)function RasGetEntryDialParams(lpszPhoneBook: PAnsiChar; var lpDialParams: TRasDialParams;

(*RASAPI*)                               var lpfPassword: LongBool): Longint; stdcall;

(*RASAPI*)

(*RASAPI*){**

(*RASAPI*)** raserror.h

(*RASAPI*)** Remote Access external API

(*RASAPI*)** RAS specific error codes *}

(*RASAPI*)

(*RASAPI*)const

(*RASAPI*)  RASBASE = 600;

(*RASAPI*)  SUCCESS = 0;

(*RASAPI*)

(*RASAPI*)  PENDING                              = (RASBASE+0);

(*RASAPI*)  ERROR_INVALID_PORT_HANDLE            = (RASBASE+1);

(*RASAPI*)  ERROR_PORT_ALREADY_OPEN              = (RASBASE+2);

(*RASAPI*)  ERROR_BUFFER_TOO_SMALL               = (RASBASE+3);

(*RASAPI*)  ERROR_WRONG_INFO_SPECIFIED           = (RASBASE+4);

(*RASAPI*)  ERROR_CANNOT_SET_PORT_INFO           = (RASBASE+5);

(*RASAPI*)  ERROR_PORT_NOT_CONNECTED             = (RASBASE+6);

(*RASAPI*)  ERROR_EVENT_INVALID                  = (RASBASE+7);

(*RASAPI*)  ERROR_DEVICE_DOES_NOT_EXIST          = (RASBASE+8);

(*RASAPI*)  ERROR_DEVICETYPE_DOES_NOT_EXIST      = (RASBASE+9);

(*RASAPI*)  ERROR_BUFFER_INVALID                 = (RASBASE+10);

(*RASAPI*)  ERROR_ROUTE_NOT_AVAILABLE            = (RASBASE+11);

(*RASAPI*)  ERROR_ROUTE_NOT_ALLOCATED            = (RASBASE+12);

(*RASAPI*)  ERROR_INVALID_COMPRESSION_SPECIFIED  = (RASBASE+13);

(*RASAPI*)  ERROR_OUT_OF_BUFFERS                 = (RASBASE+14);

(*RASAPI*)  ERROR_PORT_NOT_FOUND                 = (RASBASE+15);

(*RASAPI*)  ERROR_ASYNC_REQUEST_PENDING          = (RASBASE+16);

(*RASAPI*)  ERROR_ALREADY_DISCONNECTING          = (RASBASE+17);

(*RASAPI*)  ERROR_PORT_NOT_OPEN                  = (RASBASE+18);

(*RASAPI*)  ERROR_PORT_DISCONNECTED              = (RASBASE+19);

(*RASAPI*)  ERROR_NO_ENDPOINTS                   = (RASBASE+20);

(*RASAPI*)  ERROR_CANNOT_OPEN_PHONEBOOK          = (RASBASE+21);

(*RASAPI*)  ERROR_CANNOT_LOAD_PHONEBOOK          = (RASBASE+22);

(*RASAPI*)  ERROR_CANNOT_FIND_PHONEBOOK_ENTRY    = (RASBASE+23);

(*RASAPI*)  ERROR_CANNOT_WRITE_PHONEBOOK         = (RASBASE+24);

(*RASAPI*)  ERROR_CORRUPT_PHONEBOOK              = (RASBASE+25);

(*RASAPI*)  ERROR_CANNOT_LOAD_STRING             = (RASBASE+26);

(*RASAPI*)  ERROR_KEY_NOT_FOUND                  = (RASBASE+27);

(*RASAPI*)  ERROR_DISCONNECTION                  = (RASBASE+28);

(*RASAPI*)  ERROR_REMOTE_DISCONNECTION           = (RASBASE+29);

(*RASAPI*)  ERROR_HARDWARE_FAILURE               = (RASBASE+30);

(*RASAPI*)  ERROR_USER_DISCONNECTION             = (RASBASE+31);

(*RASAPI*)  ERROR_INVALID_SIZE                   = (RASBASE+32);

(*RASAPI*)  ERROR_PORT_NOT_AVAILABLE             = (RASBASE+33);

(*RASAPI*)  ERROR_CANNOT_PROJECT_CLIENT          = (RASBASE+34);

(*RASAPI*)  ERROR_UNKNOWN                        = (RASBASE+35);

(*RASAPI*)  ERROR_WRONG_DEVICE_ATTACHED          = (RASBASE+36);

(*RASAPI*)  ERROR_BAD_STRING                     = (RASBASE+37);

(*RASAPI*)  ERROR_REQUEST_TIMEOUT                = (RASBASE+38);

(*RASAPI*)  ERROR_CANNOT_GET_LANA                = (RASBASE+39);

(*RASAPI*)  ERROR_NETBIOS_ERROR                  = (RASBASE+40);

(*RASAPI*)  ERROR_SERVER_OUT_OF_RESOURCES        = (RASBASE+41);

(*RASAPI*)  ERROR_NAME_EXISTS_ON_NET             = (RASBASE+42);

(*RASAPI*)  ERROR_SERVER_GENERAL_NET_FAILURE     = (RASBASE+43);

(*RASAPI*)  WARNING_MSG_ALIAS_NOT_ADDED          = (RASBASE+44);

(*RASAPI*)  ERROR_AUTH_INTERNAL                  = (RASBASE+45);

(*RASAPI*)  ERROR_RESTRICTED_LOGON_HOURS         = (RASBASE+46);

(*RASAPI*)  ERROR_ACCT_DISABLED                  = (RASBASE+47);

(*RASAPI*)  ERROR_PASSWD_EXPIRED                 = (RASBASE+48);

(*RASAPI*)  ERROR_NO_DIALIN_PERMISSION           = (RASBASE+49);

(*RASAPI*)  ERROR_SERVER_NOT_RESPONDING          = (RASBASE+50);

(*RASAPI*)  ERROR_FROM_DEVICE                    = (RASBASE+51);

(*RASAPI*)  ERROR_UNRECOGNIZED_RESPONSE          = (RASBASE+52);

(*RASAPI*)  ERROR_MACRO_NOT_FOUND                = (RASBASE+53);

(*RASAPI*)  ERROR_MACRO_NOT_DEFINED              = (RASBASE+54);

(*RASAPI*)  ERROR_MESSAGE_MACRO_NOT_FOUND        = (RASBASE+55);

(*RASAPI*)  ERROR_DEFAULTOFF_MACRO_NOT_FOUND     = (RASBASE+56);

(*RASAPI*)  ERROR_FILE_COULD_NOT_BE_OPENED       = (RASBASE+57);

(*RASAPI*)  ERROR_DEVICENAME_TOO_LONG            = (RASBASE+58);

(*RASAPI*)  ERROR_DEVICENAME_NOT_FOUND           = (RASBASE+59);

(*RASAPI*)  ERROR_NO_RESPONSES                   = (RASBASE+60);

(*RASAPI*)  ERROR_NO_COMMAND_FOUND               = (RASBASE+61);

(*RASAPI*)  ERROR_WRONG_KEY_SPECIFIED            = (RASBASE+62);

(*RASAPI*)  ERROR_UNKNOWN_DEVICE_TYPE            = (RASBASE+63);

(*RASAPI*)  ERROR_ALLOCATING_MEMORY              = (RASBASE+64);

(*RASAPI*)  ERROR_PORT_NOT_CONFIGURED            = (RASBASE+65);

(*RASAPI*)  ERROR_DEVICE_NOT_READY               = (RASBASE+66);

(*RASAPI*)  ERROR_READING_INI_FILE               = (RASBASE+67);

(*RASAPI*)  ERROR_NO_CONNECTION                  = (RASBASE+68);

(*RASAPI*)  ERROR_BAD_USAGE_IN_INI_FILE          = (RASBASE+69);

(*RASAPI*)  ERROR_READING_SECTIONNAME            = (RASBASE+70);

(*RASAPI*)  ERROR_READING_DEVICETYPE             = (RASBASE+71);

(*RASAPI*)  ERROR_READING_DEVICENAME             = (RASBASE+72);

(*RASAPI*)  ERROR_READING_USAGE                  = (RASBASE+73);

(*RASAPI*)  ERROR_READING_MAXCONNECTBPS          = (RASBASE+74);

(*RASAPI*)  ERROR_READING_MAXCARRIERBPS          = (RASBASE+75);

(*RASAPI*)  ERROR_LINE_BUSY                      = (RASBASE+76);

(*RASAPI*)  ERROR_VOICE_ANSWER                   = (RASBASE+77);

(*RASAPI*)  ERROR_NO_ANSWER                      = (RASBASE+78);

(*RASAPI*)  ERROR_NO_CARRIER                     = (RASBASE+79);

(*RASAPI*)  ERROR_NO_DIALTONE                    = (RASBASE+80);

(*RASAPI*)  ERROR_IN_COMMAND                     = (RASBASE+81);

(*RASAPI*)  ERROR_WRITING_SECTIONNAME            = (RASBASE+82);

(*RASAPI*)  ERROR_WRITING_DEVICETYPE             = (RASBASE+83);

(*RASAPI*)  ERROR_WRITING_DEVICENAME             = (RASBASE+84);

(*RASAPI*)  ERROR_WRITING_MAXCONNECTBPS          = (RASBASE+85);

(*RASAPI*)  ERROR_WRITING_MAXCARRIERBPS          = (RASBASE+86);

(*RASAPI*)  ERROR_WRITING_USAGE                  = (RASBASE+87);

(*RASAPI*)  ERROR_WRITING_DEFAULTOFF             = (RASBASE+88);

(*RASAPI*)  ERROR_READING_DEFAULTOFF             = (RASBASE+89);

(*RASAPI*)  ERROR_EMPTY_INI_FILE                 = (RASBASE+90);

(*RASAPI*)  ERROR_AUTHENTICATION_FAILURE         = (RASBASE+91);

(*RASAPI*)  ERROR_PORT_OR_DEVICE                 = (RASBASE+92);

(*RASAPI*)  ERROR_NOT_BINARY_MACRO               = (RASBASE+93);

(*RASAPI*)  ERROR_DCB_NOT_FOUND                  = (RASBASE+94);

(*RASAPI*)  ERROR_STATE_MACHINES_NOT_STARTED     = (RASBASE+95);

(*RASAPI*)  ERROR_STATE_MACHINES_ALREADY_STARTED = (RASBASE+96);

(*RASAPI*)  ERROR_PARTIAL_RESPONSE_LOOPING       = (RASBASE+97);

(*RASAPI*)  ERROR_UNKNOWN_RESPONSE_KEY           = (RASBASE+98);

(*RASAPI*)  ERROR_RECV_BUF_FULL                  = (RASBASE+99);

(*RASAPI*)  ERROR_CMD_TOO_LONG                   = (RASBASE+100);

(*RASAPI*)  ERROR_UNSUPPORTED_BPS                = (RASBASE+101);

(*RASAPI*)  ERROR_UNEXPECTED_RESPONSE            = (RASBASE+102);

(*RASAPI*)  ERROR_INTERACTIVE_MODE               = (RASBASE+103);

(*RASAPI*)  ERROR_BAD_CALLBACK_NUMBER            = (RASBASE+104);

(*RASAPI*)  ERROR_INVALID_AUTH_STATE             = (RASBASE+105);

(*RASAPI*)  ERROR_WRITING_INITBPS                = (RASBASE+106);

(*RASAPI*)  ERROR_X25_DIAGNOSTIC                 = (RASBASE+107);

(*RASAPI*)  ERROR_ACCT_EXPIRED                   = (RASBASE+108);

(*RASAPI*)  ERROR_CHANGING_PASSWORD              = (RASBASE+109);

(*RASAPI*)  ERROR_OVERRUN                        = (RASBASE+110);

(*RASAPI*)  ERROR_RASMAN_CANNOT_INITIALIZE       = (RASBASE+111);

(*RASAPI*)  ERROR_BIPLEX_PORT_NOT_AVAILABLE      = (RASBASE+112);

(*RASAPI*)  ERROR_NO_ACTIVE_ISDN_LINES           = (RASBASE+113);

(*RASAPI*)  ERROR_NO_ISDN_CHANNELS_AVAILABLE     = (RASBASE+114);

(*RASAPI*)  ERROR_TOO_MANY_LINE_ERRORS           = (RASBASE+115);

(*RASAPI*)  ERROR_IP_CONFIGURATION               = (RASBASE+116);

(*RASAPI*)  ERROR_NO_IP_ADDRESSES                = (RASBASE+117);

(*RASAPI*)  ERROR_PPP_TIMEOUT                    = (RASBASE+118);

(*RASAPI*)  ERROR_PPP_REMOTE_TERMINATED          = (RASBASE+119);

(*RASAPI*)  ERROR_PPP_NO_PROTOCOLS_CONFIGURED    = (RASBASE+120);

(*RASAPI*)  ERROR_PPP_NO_RESPONSE                = (RASBASE+121);

(*RASAPI*)  ERROR_PPP_INVALID_PACKET             = (RASBASE+122);

(*RASAPI*)  ERROR_PHONE_NUMBER_TOO_LONG          = (RASBASE+123);

(*RASAPI*)  ERROR_IPXCP_NO_DIALOUT_CONFIGURED    = (RASBASE+124);

(*RASAPI*)  ERROR_IPXCP_NO_DIALIN_CONFIGURED     = (RASBASE+125);

(*RASAPI*)  ERROR_IPXCP_DIALOUT_ALREADY_ACTIVE   = (RASBASE+126);

(*RASAPI*)  ERROR_ACCESSING_TCPCFGDLL            = (RASBASE+127);

(*RASAPI*)  ERROR_NO_IP_RAS_ADAPTER              = (RASBASE+128);

(*RASAPI*)  ERROR_SLIP_REQUIRES_IP               = (RASBASE+129);

(*RASAPI*)  ERROR_PROJECTION_NOT_COMPLETE        = (RASBASE+130);

(*RASAPI*)  ERROR_PROTOCOL_NOT_CONFIGURED        = (RASBASE+131);

(*RASAPI*)  ERROR_PPP_NOT_CONVERGING             = (RASBASE+132);

(*RASAPI*)  ERROR_PPP_CP_REJECTED                = (RASBASE+133);

(*RASAPI*)  ERROR_PPP_LCP_TERMINATED             = (RASBASE+134);

(*RASAPI*)  ERROR_PPP_REQUIRED_ADDRESS_REJECTED  = (RASBASE+135);

(*RASAPI*)  ERROR_PPP_NCP_TERMINATED             = (RASBASE+136);

(*RASAPI*)  ERROR_PPP_LOOPBACK_DETECTED          = (RASBASE+137);

(*RASAPI*)  ERROR_PPP_NO_ADDRESS_ASSIGNED        = (RASBASE+138);

(*RASAPI*)  ERROR_CANNOT_USE_LOGON_CREDENTIALS   = (RASBASE+139);

(*RASAPI*)  ERROR_TAPI_CONFIGURATION             = (RASBASE+140);

(*RASAPI*)  ERROR_NO_LOCAL_ENCRYPTION            = (RASBASE+141);

(*RASAPI*)  ERROR_NO_REMOTE_ENCRYPTION           = (RASBASE+142);

(*RASAPI*)  ERROR_REMOTE_REQUIRES_ENCRYPTION     = (RASBASE+143);

(*RASAPI*)  ERROR_IPXCP_NET_NUMBER_CONFLICT      = (RASBASE+144);

(*RASAPI*)  ERROR_INVALID_SMM                    = (RASBASE+145);

(*RASAPI*)  ERROR_SMM_UNINITIALIZED              = (RASBASE+146);

(*RASAPI*)  ERROR_NO_MAC_FOR_PORT                = (RASBASE+147);

(*RASAPI*)  ERROR_SMM_TIMEOUT                    = (RASBASE+148);

(*RASAPI*)  ERROR_BAD_PHONE_NUMBER               = (RASBASE+149);

(*RASAPI*)  ERROR_WRONG_MODULE                   = (RASBASE+150);

(*RASAPI*)

(*RASAPI*)  RASBASEEND                           = (RASBASE+150);

(*RASAPI*)

(*RASAPI*){* Copyright (c) 1995, Microsoft Corporation, all rights reserved

(*RASAPI*)**

(*RASAPI*)** rnaph.h  (to be merged with ras.h)

(*RASAPI*)**

(*RASAPI*)** Remote Access external API

(*RASAPI*)** Public header for external API clients

(*RASAPI*)**}

(*RASAPI*)

(*RASAPI*){*

(*RASAPI*)   Original conversion by Gideon le Grange <legrang@adept.co.za>

(*RASAPI*)   Merged with ras.pas by Davide Moretti <dmoretti@iper.net>

(*RASAPI*)*}

(*RASAPI*)

(*RASAPI*)const

(*RASAPI*)  RAS_MaxAreaCode   =  10;

(*RASAPI*)  RAS_MaxPadType    =  32;

(*RASAPI*)  RAS_MaxX25Address = 200;

(*RASAPI*)  RAS_MaxFacilities = 200;

(*RASAPI*)  RAS_MaxUserData   = 200;

(*RASAPI*)

(*RASAPI*)

(*RASAPI*)type

(*RASAPI*)(* Describes a RAS IP Address *)

(*RASAPI*)  LPRasIPAddr = ^TRasIPAddr;

(*RASAPI*)  TRasIPAddr = record

(*RASAPI*)    A, B, C, D: Byte;

(*RASAPI*)  end;

(*RASAPI*)

(*RASAPI*)(* Describes a RAS phonebook entry *)

(*RASAPI*)  LPRasEntryA = ^TRasEntryA;

(*RASAPI*)  TRasEntryA  = record

(*RASAPI*)    dwSize,

(*RASAPI*)    dwfOptions,

(*RASAPI*)    dwCountryID,

(*RASAPI*)    dwCountryCode          : Longint;

(*RASAPI*)    szAreaCode             : array[0.. RAS_MaxAreaCode] of AnsiChar;

(*RASAPI*)    szLocalPhoneNumber     : array[0..RAS_MaxPhoneNumber] of AnsiChar;

(*RASAPI*)    dwAlternatesOffset     : Longint;

(*RASAPI*)    ipaddr,

(*RASAPI*)    ipaddrDns,

(*RASAPI*)    ipaddrDnsAlt,

(*RASAPI*)    ipaddrWins,

(*RASAPI*)    ipaddrWinsAlt          : TRasIPAddr;

(*RASAPI*)    dwFrameSize,

(*RASAPI*)    dwfNetProtocols,

(*RASAPI*)    dwFramingProtocol      : Longint;

(*RASAPI*)    szScript               : Array[0..MAX_PATH - 1] of AnsiChar;

(*RASAPI*)    szAutodialDll          : Array [0..MAX_PATH - 1] of AnsiChar;

(*RASAPI*)    szAutodialFunc         : Array [0..MAX_PATH - 1] of AnsiChar;

(*RASAPI*)    szDeviceType           : Array [0..RAS_MaxDeviceType] of AnsiChar;

(*RASAPI*)    szDeviceName           : Array [0..RAS_MaxDeviceName] of AnsiChar;

(*RASAPI*)    szX25PadType           : Array [0..RAS_MaxPadType] of AnsiChar;

(*RASAPI*)    szX25Address           : Array [0..RAS_MaxX25Address] of AnsiChar;

(*RASAPI*)    szX25Facilities        : Array [0..RAS_MaxFacilities] of AnsiChar;

(*RASAPI*)    szX25UserData          : Array [0..RAS_MaxUserData] of AnsiChar;

(*RASAPI*)    dwChannels,

(*RASAPI*)    dwReserved1,

(*RASAPI*)    dwReserved2            : Longint;

(*RASAPI*)  end;

(*RASAPI*)

(*RASAPI*)  LPRasEntryW = ^TRasEntryW;

(*RASAPI*)  TRasEntryW  = record

(*RASAPI*)    dwSize,

(*RASAPI*)    dwfOptions,

(*RASAPI*)    dwCountryID,

(*RASAPI*)    dwCountryCode          : Longint;

(*RASAPI*)    szAreaCode             : array[0.. RAS_MaxAreaCode] of WideChar;

(*RASAPI*)    szLocalPhoneNumber     : array[0..RAS_MaxPhoneNumber] of WideChar;

(*RASAPI*)    dwAlternatesOffset     : Longint;

(*RASAPI*)    ipaddr,

(*RASAPI*)    ipaddrDns,

(*RASAPI*)    ipaddrDnsAlt,

(*RASAPI*)    ipaddrWins,

(*RASAPI*)    ipaddrWinsAlt          : TRasIPAddr;

(*RASAPI*)    dwFrameSize,

(*RASAPI*)    dwfNetProtocols,

(*RASAPI*)    dwFramingProtocol      : Longint;

(*RASAPI*)    szScript               : Array[0..MAX_PATH - 1] of WideChar;

(*RASAPI*)    szAutodialDll          : Array [0..MAX_PATH - 1] of WideChar;

(*RASAPI*)    szAutodialFunc         : Array [0..MAX_PATH - 1] of WideChar;

(*RASAPI*)    szDeviceType           : Array [0..RAS_MaxDeviceType] of WideChar;

(*RASAPI*)    szDeviceName           : Array [0..RAS_MaxDeviceName] of WideChar;

(*RASAPI*)    szX25PadType           : Array [0..RAS_MaxPadType] of WideChar;

(*RASAPI*)    szX25Address           : Array [0..RAS_MaxX25Address] of WideChar;

(*RASAPI*)    szX25Facilities        : Array [0..RAS_MaxFacilities] of WideChar;

(*RASAPI*)    szX25UserData          : Array [0..RAS_MaxUserData] of WideChar;

(*RASAPI*)    dwChannels,

(*RASAPI*)    dwReserved1,

(*RASAPI*)    dwReserved2            : Longint;

(*RASAPI*)  end;

(*RASAPI*)

(*RASAPI*)  LPRasEntry = ^TRasEntry;

(*RASAPI*)  TRasEntry  = TRasEntryA;

(*RASAPI*)

(*RASAPI*)(* Describes Country Information *)

(*RASAPI*)  LPRasCtryInfo = ^TRasCtryInfo;

(*RASAPI*)  TRasCtryInfo  = record

(*RASAPI*)    dwSize,

(*RASAPI*)    dwCountryID,

(*RASAPI*)    dwNextCountryID,

(*RASAPI*)    dwCountryCode,

(*RASAPI*)    dwCountryNameOffset : Longint;

(*RASAPI*)  end;

(*RASAPI*)

(*RASAPI*)(* Describes RAS Device Information *)

(*RASAPI*)  LPRasDevInfoA = ^TRasDevInfoA;

(*RASAPI*)  TRasDevInfoA  = record

(*RASAPI*)    dwSize       : Longint;

(*RASAPI*)    szDeviceType : Array[0..RAS_MaxDeviceType] of AnsiChar;

(*RASAPI*)    szDeviceName : Array[0..RAS_MaxDeviceName] of AnsiChar;

(*RASAPI*)  end;

(*RASAPI*)

(*RASAPI*)  LPRasDevInfoW = ^TRasDevInfoW;

(*RASAPI*)  TRasDevInfoW  = record

(*RASAPI*)    dwSize       : Longint;

(*RASAPI*)    szDeviceType : Array[0..RAS_MaxDeviceType] of WideChar;

(*RASAPI*)    szDeviceName : Array[0..RAS_MaxDeviceName] of WideChar;

(*RASAPI*)  end;

(*RASAPI*)

(*RASAPI*)  LPRasDevInfo = ^TRasDevInfo;

(*RASAPI*)  TRasDevInfo  = TRasDevInfoA;

(*RASAPI*)

(*RASAPI*)const

(*RASAPI*)(* TRasEntry 'dwfOptions' bit flags. *)

(*RASAPI*)  RASEO_UseCountryAndAreaCodes = $00000001;

(*RASAPI*)  RASEO_SpecificIpAddr         = $00000002;

(*RASAPI*)  RASEO_SpecificNameServers    = $00000004;

(*RASAPI*)  RASEO_IpHeaderCompression    = $00000008;

(*RASAPI*)  RASEO_RemoteDefaultGateway   = $00000010;

(*RASAPI*)  RASEO_DisableLcpExtensions   = $00000020;

(*RASAPI*)  RASEO_TerminalBeforeDial     = $00000040;

(*RASAPI*)  RASEO_TerminalAfterDial      = $00000080;

(*RASAPI*)  RASEO_ModemLights            = $00000100;

(*RASAPI*)  RASEO_SwCompression          = $00000200;

(*RASAPI*)  RASEO_RequireEncryptedPw     = $00000400;

(*RASAPI*)  RASEO_RequireMsEncryptedPw   = $00000800;

(*RASAPI*)  RASEO_RequireDataEncryption  = $00001000;

(*RASAPI*)  RASEO_NetworkLogon           = $00002000;

(*RASAPI*)  RASEO_UseLogonCredentials    = $00004000;

(*RASAPI*)  RASEO_PromoteAlternates      = $00008000;

(*RASAPI*)

(*RASAPI*)(* TRasEntry 'dwfNetProtocols' bit flags. (session negotiated protocols) *)

(*RASAPI*)  RASNP_Netbeui = $00000001;  // Negotiate NetBEUI

(*RASAPI*)  RASNP_Ipx     = $00000002;  // Negotiate IPX

(*RASAPI*)  RASNP_Ip      = $00000004;  // Negotiate TCP/IP

(*RASAPI*)

(*RASAPI*)(* TRasEntry 'dwFramingProtocols' (framing protocols used by the server) *)

(*RASAPI*)  RASFP_Ppp  = $00000001;  // Point-to-Point Protocol (PPP)

(*RASAPI*)  RASFP_Slip = $00000002;  // Serial Line Internet Protocol (SLIP)

(*RASAPI*)  RASFP_Ras  = $00000004;  // Microsoft proprietary protocol

(*RASAPI*)

(*RASAPI*)(* TRasEntry 'szDeviceType' strings *)

(*RASAPI*)  RASDT_Modem = 'modem';     // Modem

(*RASAPI*)  RASDT_Isdn  = 'isdn';      // ISDN

(*RASAPI*)  RASDT_X25   = 'x25';      // X.25

(*RASAPI*)

(*RASAPI*)(* RAS functions found in RNAPH.DLL *)

(*RASAPI*)function RasValidateEntryNameA(lpszPhonebook,szEntry: PAnsiChar): Longint; stdcall;

(*RASAPI*)function RasValidateEntryNameW(lpszPhonebook,szEntry: PWideChar): Longint; stdcall;

(*RASAPI*)function RasValidateEntryName(lpszPhonebook,szEntry: PAnsiChar): Longint; stdcall;

(*RASAPI*)

(*RASAPI*)function RasRenameEntryA(lpszPhonebook,szEntryOld,szEntryNew: PAnsiChar): Longint; stdcall;

(*RASAPI*)function RasRenameEntryW(lpszPhonebook,szEntryOld,szEntryNew: PWideChar): Longint; stdcall;

(*RASAPI*)function RasRenameEntry(lpszPhonebook,szEntryOld,szEntryNew: PAnsiChar): Longint; stdcall;

(*RASAPI*)

(*RASAPI*)function RasDeleteEntryA(lpszPhonebook,szEntry: PAnsiChar): Longint; stdcall;

(*RASAPI*)function RasDeleteEntryW(lpszPhonebook,szEntry: PWideChar): Longint; stdcall;

(*RASAPI*)function RasDeleteEntry(lpszPhonebook,szEntry: PAnsiChar): Longint; stdcall;

(*RASAPI*)

(*RASAPI*)function RasGetEntryPropertiesA(lpszPhonebook, szEntry: PAnsiChar; lpbEntry: Pointer;

(*RASAPI*)                                var lpdwEntrySize: Longint; lpbDeviceInfo: Pointer;

(*RASAPI*)                                var lpdwDeviceInfoSize: Longint): Longint; stdcall;

(*RASAPI*)function RasGetEntryPropertiesW(lpszPhonebook, szEntry: PWideChar; lpbEntry: Pointer;

(*RASAPI*)                                var lpdwEntrySize: Longint; lpbDeviceInfo: Pointer;

(*RASAPI*)                                var lpdwDeviceInfoSize: Longint): Longint; stdcall;

(*RASAPI*)function RasGetEntryProperties(lpszPhonebook, szEntry: PAnsiChar; lpbEntry: Pointer;

(*RASAPI*)                                var lpdwEntrySize: Longint; lpbDeviceInfo: Pointer;

(*RASAPI*)                                var lpdwDeviceInfoSize: Longint): Longint; stdcall;

(*RASAPI*)

(*RASAPI*)function RasSetEntryPropertiesA(lpszPhonebook, szEntry: PAnsiChar; lpbEntry: Pointer;

(*RASAPI*)                                dwEntrySize: Longint; lpbDeviceInfo: Pointer;

(*RASAPI*)                                dwDeviceInfoSize: Longint): Longint; stdcall;

(*RASAPI*)function RasSetEntryPropertiesW(lpszPhonebook, szEntry: PWideChar; lpbEntry: Pointer;

(*RASAPI*)                                dwEntrySize: Longint; lpbDeviceInfo: Pointer;

(*RASAPI*)                                dwDeviceInfoSize: Longint): Longint; stdcall;

(*RASAPI*)function RasSetEntryProperties(lpszPhonebook, szEntry: PAnsiChar; lpbEntry: Pointer;

(*RASAPI*)                               dwEntrySize: Longint; lpbDeviceInfo: Pointer;

(*RASAPI*)                               dwDeviceInfoSize: Longint): Longint; stdcall;

(*RASAPI*)

(*RASAPI*)function RasGetCountryInfoA(var lpCtryInfo: TRasCtryInfo;var lpdwSize: Longint): Longint; stdcall;

(*RASAPI*)function RasGetCountryInfoW(var lpCtryInfo: TRasCtryInfo;var lpdwSize: Longint): Longint; stdcall;

(*RASAPI*)function RasGetCountryInfo(var lpCtryInfo: TRasCtryInfo;var lpdwSize: Longint): Longint; stdcall;

(*RASAPI*)

(*RASAPI*)function RasEnumDevicesA(lpBuff: LpRasDevInfoA; var lpcbSize: Longint;

(*RASAPI*)                         var lpcDevices: Longint): Longint; stdcall;

(*RASAPI*)function RasEnumDevicesW(lpBuff: LpRasDevInfoW; var lpcbSize: Longint;

(*RASAPI*)                         var lpcDevices: Longint): Longint; stdcall;

(*RASAPI*)function RasEnumDevices(lpBuff: LpRasDevInfo; var lpcbSize: Longint;

(*RASAPI*)                         var lpcDevices: Longint): Longint; stdcall;

(*RASAPI*)

{******************************************************}

{******************************************************}

{******************************************************}

{******************************************************}

{******************************************************}

{******************************************************}

const MaxEntries = 100; //It's enough

type

 TOnEntryGet   = procedure (Sender : TObject; EntryName : Array of {Ansi}Char) of Object;

 TStandartEv   = procedure (Sender : TObject) of object;

 TOnNotConn    = procedure (Sender : TObject; ErrorCode : Integer; ErrorMessage : String) of object;

 TOnAsyncEvent = procedure (Sender : TObject; State : TRasConnState; Error : Integer;

                            MessageText : String) of object;

 TOnError      = procedure (Sender : TObject; ErrorCode : Integer; ErrorMessage : String) of Object;

 TOnActiveConn = procedure (Sender : TObject; Handle : THRasConn; Status : TRasConnStatus;

                            StatusString : String;

                            EntryName, DeviceType, DeviceName : Array of Char) of object;

 TDialMode = (dmAsync,dmSync); //dmAsync - Function will exit BEFORE finishing dialing

                               //          Events : onDialing,onError,onAsyncEvent

                               //dmSync  - Function will exit AFTER finishing dialing

                               //          Events : onDialing,onConnect,onNotConnected

 TLanguage = (English,Czech);

 TDialUp = class(TComponent)

 private

   FEntries    : TStringList;

   FDialMode   : TDialMode;

   FEntry2Dial : String;

   FLanguage   : TLanguage;

   FTimer      : TTimer;

   FOnEntryGet              : TOnEntryGet;

   FOnDialing, FOnConnected : TStandartEv;

   FOnNotConnected          : TOnNotConn;

   FOnAsyncEvent            : TOnAsyncEvent;

   FOnError                 : TOnError;

   FOnActiveConn            : TOnActiveConn;

 protected

   procedure Timer(Sender: TObject); virtual;

 public

   hRAS : ThRASConn; {Handle to RAS connection dialed with by this component when connected}

   AsyncStatus : Boolean;

   AMsg,AError : Integer;

   AState      : TRasConnState;

   constructor Create(AOwner:TComponent); override;

   destructor Destroy; override;

   function Dial : Integer;

   function GetEntries : Integer;

   function GetConnections : Integer;

   function HangUp : Integer;

   function HangUpConn(Handle : THRasConn) : Integer;

   function CreateEntry : Integer;

   function EditEntry : Integer;

   function DeleteEntry : Integer;

   function RenameEntryTo(S : String) : Integer;

   function SetEntryUserName(Value : String) : Integer;

   function SetEntryPassword(Value : String) : Integer;

   function RemovePassword : Integer;

   function GetEntryUserName(var Value : String) : Integer;

   function GetEntryPassword(var Value : String) : Integer;

   function StatusString(State: TRasConnState; Error: Integer): String;

   function StatusStringCZ(State: TRasConnState; Error: Integer): String;

 published

   property Name;

   property Tag;

   property DialMode : TDialMode

     read FDialMode write FDialMode;

   property Entries : TStringList

     read FEntries;

   property Entry : String

     read FEntry2Dial write FEntry2Dial;

   property Language : TLanguage

     read FLanguage write FLanguage;

   property OnEntryGet : TOnEntryGet

     read FOnEntryGet write FOnEntryGet;

   property OnDialing : TStandartEv

     read FOnDialing write FOnDialing;

   property OnConnect : TStandartEv

     read FOnConnected write FOnConnected;

   property OnNotConnected : TOnNotConn

     read FOnNotConnected write FOnNotConnected;

   property OnAsyncEvent : TOnAsyncEvent

     read FOnAsyncEvent write FOnAsyncEvent;

   property OnError : TOnError

     read FOnError write FOnError;

   property OnActiveConnection : TOnActiveConn

     read FOnActiveConn write FOnActiveConn;

end;

procedure Register;

implementation

var xSelf : Pointer;

procedure TDialUp.Timer(Sender: TObject);

begin

 FTimer.Enabled:=False;

 if AsyncStatus=False then Exit;

 if Language=Czech then

 begin

   if Assigned(FOnAsyncEvent) then FOnAsyncEvent(Self,AState,AError,StatusStringCZ(AState, AError));

 end else

 begin

   if Assigned(FOnAsyncEvent) then FOnAsyncEvent(Self,AState,AError,StatusString(AState, AError));

 end;

 AsyncStatus:=False;

end;

procedure RasCallback(msg: Integer; state: TRasConnState;

 error: Integer); stdcall;

begin

 While TDialUp(xSelf).AsyncStatus=True do ;

 TDialUp(xSelf).AsyncStatus:=True;

 TDialUp(xSelf).AMsg:=Msg;

 TDialUp(xSelf).AState:=State;

 TDialUp(xSelf).AError:=Error;

 TDialUp(xSelf).FTimer.Enabled:=True;

//  TDialUp(xSelf).FOnDialing(xSelf);

//  TDialUp(xSelf).OnAsyncEvent(xSelf,State,Error,TDialUp(xSelf).StatusString(state, error));

end;

{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}

//procedure RasCallback(Msg: Integer; State: TRasConnState; Error: Integer); stdcall; forward;

procedure Register;

begin

 RegisterComponents('Internet',[TDialUp]);

end;

{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}

constructor TDialUp.Create(AOwner:TComponent);

begin

 inherited Create(AOwner);

 AsyncStatus:=False;

 FEntries:=TStringList.Create;

 FTimer:=TTimer.Create(Self);

 FTimer.Enabled:=False; FTimer.Interval:=1;

 FTimer.OnTimer:=Timer;

end;

{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}

destructor TDialUp.Destroy;

begin

 inherited Destroy;

 FEntries.Free;

end;

{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}

Function TDialUp.Dial : Integer;

var

 Fp                  : LongBool;

 R                   : Integer;

 C                   : Array[0..100] of Char;

 ErrS                : String;

 DialParams          : TRasDialParams;

begin

 HangUp;

 FillChar(DialParams, SizeOf(TRasDialParams), 0);

 with DialParams do

 begin

   dwSize:=Sizeof(TRasDialParams);

   StrPCopy(szEntryName, FEntry2Dial);

 end;

 R:=RasGetEntryDialParams(nil, DialParams, Fp);

 if R<>0 then

 begin

   Result:=R;

   if Assigned(FOnError) then FOnError(Self,R,'GetEntryDialParams failed');

   Exit;

 end;

 hRAS:=0;

 if DialMode=dmSync then // Synchronous dial

 begin

   if Assigned(FOnDialing) then FOnDialing(Self);

   R:=RasDial(nil, nil, DialParams, 0, nil, hRAS);

   if R=0 then

   begin

     if Assigned(FOnConnected) then

       FOnConnected(Self)

   end else

   begin

     if hRas<>0 then

       RasHangUp(hRas);

     RasGetErrorString(R, C, 100); ErrS:=C;

     if Assigned(FOnNotConnected) then FOnNotConnected(Self,R,ErrS);

   end;

 end else // Asynchronous dial

 begin

   // Async dial

   xSelf:=Self;

   if Assigned(FOnDialing) then FOnDialing(Self);

   R:=RasDial(nil, nil, DialParams, 0, @RasCallback, hRAS);

   if R<>0 then

   begin

     RasGetErrorString(R,C,100);

     if Assigned(FOnError) then FOnError(Self,R,C);

   end;

 end;

 Result:=R;

end;

{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}

Function TDialUp.GetEntries : Integer;

var

 BuffSize          : Integer;

 Entries           : Integer;

 Entry             : Array[1..MaxEntries] of TRasEntryName;

 X,Result_         : Integer;

begin

 Result:=0;

 FEntries.Clear;

 Entry[1].dwSize:=SizeOf(TRasEntryName);

 BuffSize:=SizeOf(TRasEntryName)*MaxEntries;

 Result_:=RasEnumEntries(nil, nil, @Entry[1], BuffSize, Entries);

 if (Result_=0) and (Entries>0) then

 begin

   for X:=1 to Entries do

   begin

     FEntries.Add(Entry[x].szEntryName);

     If Assigned(FOnEntryGet) then FOnEntryGet(Self,Entry[x].szEntryName);

   end;

 end else

 Result:=Result_;

end;

{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}

Function TDialUp.GetConnections : Integer;

var

   BufSize                     : Integer;

   NumEntries                  : Integer;

   X                           : Integer;

   Entries                     : Array[1..MaxEntries] of TRasConn;

   Stat                        : TRasConnStatus;

   Result_                     : Integer;

   S                           : String;

begin

 Result:=0;

 Entries[1].dwSize := SizeOf(TRasConn);

 Bufsize:=SizeOf(TRasConn)*MaxEntries;

 FillChar(Stat, Sizeof(TRasConnStatus), 0);

 Stat.dwSize:=Sizeof(TRasConnStatus);

 Result_:=RasEnumConnections(@Entries[1], BufSize, NumEntries);

 if Result_=0 then

 begin

   if NumEntries > 0 then

   for X:=1 to NumEntries do

   begin

     RasGetConnectStatus(Entries[X].HRasConn, Stat);

     if Language=Czech then S:=StatusStringCZ(Stat.RasConnState, Stat.dwError) else

       S:=StatusString(Stat.RasConnState, Stat.dwError);

     if Assigned(FOnActiveConn) then FOnActiveConn(Self, Entries[X].HRasConn,

                                                   Stat, S,

                                                   Entries[X].szEntryName,

                                                   Entries[X].szDeviceType,

                                                   Entries[X].szDeviceName);

   end;

 end else Result:=Result_;

end;

{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}

Function TDialUp.HangUp : Integer;

begin

 Result:=RasHangUp(hRas);

end;

{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}

Function TDialUp.HangUpConn(Handle : THRasConn) : Integer;

begin

 Result:=RasHangUp(Handle);

end;

{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}

Function TDialUp.CreateEntry : Integer;

begin

 if (Owner is TForm) then

   Result:=RasCreatePhonebookEntry((Owner as TForm).Handle, nil) else

   Result:=RasCreatePhonebookEntry(0, nil);

end;

{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}

Function TDialUp.EditEntry : Integer;

begin

 if (Owner is TForm) then

   Result:=RasEditPhonebookEntry((Owner as TForm).Handle, nil, PChar(FEntry2Dial)) else

   Result:=RasEditPhonebookEntry(0, nil, PChar(FEntry2Dial));

end;

{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}

Function TDialUp.RenameEntryTo(S : String) : Integer;

begin

 Result:=RasRenameEntry(nil, PChar(FEntry2Dial), PChar(S));

end;

{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}

Function TDialUp.DeleteEntry : Integer;

begin

 Result:=RasDeleteEntry(nil, PChar(FEntry2Dial))

end;

{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}

function TDialUp.SetEntryUserName(Value : String) : Integer;

var DialParams : TRasDialParams;

begin

 with DialParams do

 begin

   dwSize:=Sizeof(TRasDialParams);

   StrPCopy(szEntryName, PChar(FEntry2Dial));

   StrPCopy(szUserName, Value);

 end;

 Result:=RasSetEntryDialParams(nil, DialParams, False);

end;

{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}

function TDialUp.SetEntryPassword(Value : String) : Integer;

var DialParams : TRasDialParams;

begin

 with DialParams do

 begin

   dwSize:=Sizeof(TRasDialParams);

   StrPCopy(szEntryName, PChar(FEntry2Dial));

   StrPCopy(szPassword, Value);

 end;

 Result:=RasSetEntryDialParams(nil, DialParams, False);

end;

{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}

function TDialUp.RemovePassword : Integer;

var DialParams : TRasDialParams;

begin

 with DialParams do

 begin

   dwSize:=Sizeof(TRasDialParams);

   StrPCopy(szEntryName, PChar(FEntry2Dial));

 end;

 Result:=RasSetEntryDialParams(nil, DialParams, True);

end;

{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}

function TDialUp.GetEntryUserName(var Value : String) : Integer;

var

 Fp         : LongBool;

 R          : Integer;

//  C          : Array[0..100] of Char;

 DialParams : TRasDialParams;

begin

 FillChar(DialParams, SizeOf(TRasDialParams), 0);

 with DialParams do

 begin

   dwSize:=Sizeof(TRasDialParams);

   StrPCopy(szEntryName, FEntry2Dial);

 end;

 R:=RasGetEntryDialParams(nil, DialParams, Fp);

 if R=0 then

 with DialParams do

 begin

   Value:=szUserName;

 end;

 Result:=R;

end;

{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}

function TDialUp.GetEntryPassword(var Value : String) : Integer;

var

 Fp         : LongBool;

 R          : Integer;

//  C          : Array[0..100] of Char;

 DialParams : TRasDialParams;

begin

 FillChar(DialParams, SizeOf(TRasDialParams), 0);

 with DialParams do

 begin

   dwSize:=Sizeof(TRasDialParams);

   StrPCopy(szEntryName, FEntry2Dial);

 end;

 R:=RasGetEntryDialParams(nil, DialParams, Fp);

 if R=0 then

 with DialParams do

 begin

   if Fp then

     Value:=szPassword else Value:='';

 end;

 Result:=R;

end;

{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}

function TDialUp.StatusString(State: TRasConnState; Error: Integer): String;

var

 C      : Array[0..100] of Char;

 S      : String;

begin

 if Error<>0 then

 begin

   RasGetErrorString(Error, C, 100);

   Result:=C;

 end else

 begin

   S:='';

   case State of

     RASCS_OpenPort:

       S:='Opening port';

     RASCS_PortOpened:

       S:='Port opened';

     RASCS_ConnectDevice:

       S:='Connecting device';

     RASCS_DeviceConnected:

       S:='Device connected';

     RASCS_AllDevicesConnected:

       S:='All devices connected';

     RASCS_Authenticate:

       S:='Start authenticating';

     RASCS_AuthNotify:

       S:='Authentication: notify';

     RASCS_AuthRetry:

       S:='Authentication: retry';

     RASCS_AuthCallback:

       S:='Authentication: callback';

     RASCS_AuthChangePassword:

       S:='Authentication: change password';

     RASCS_AuthProject:

       S:='Authentication: projecting';

     RASCS_AuthLinkSpeed:

       S:='Authentication: link speed';

     RASCS_AuthAck:

       S:='Authentication: acknowledge';

     RASCS_ReAuthenticate:

       S:='Authentication: reauthenticate';

     RASCS_Authenticated:

       S:='Authenticated';

     RASCS_PrepareForCallback:

       S:='Preparing for callback';

     RASCS_WaitForModemReset:

       S:='Waiting for modem reset';

     RASCS_WaitForCallback:

       S:='Waiting for callback';

     RASCS_Projected:

       S:='Projected';

     RASCS_StartAuthentication:

       S:='Start authentication';

     RASCS_CallbackComplete:

       S:='Callback complete';

     RASCS_LogonNetwork:

       S:='Logging on network';

     RASCS_Interactive:

       S:='Interactive';

     RASCS_RetryAuthentication:

       S:='Retry Authentication';

     RASCS_CallbackSetByCaller:

       S:='Callback set by caller';

     RASCS_PasswordExpired:

       S:='Password expired';

     RASCS_Connected:

       S:='Connected';

     RASCS_Disconnected:

       S:='Disconnected';

   end;

   Result:=S;

 end;

end;

function TDialUp.StatusStringCZ(State: TRasConnState; Error: Integer): String;

var

 C      : Array[0..100] of Char;

 S      : String;

begin

 if Error<>0 then

 begin

   RasGetErrorString(Error, C, 100);

   Result:=C;

 end else

 begin

   S:='';

   case State of

     RASCS_OpenPort:

       S:='Otev韗?se port';

     RASCS_PortOpened:

       S:='Port otev鴈n';

     RASCS_ConnectDevice:

       S:='Prob韍?spojov醤?;

     RASCS_DeviceConnected:

       S:='Nav醶醤o spojen?;

     RASCS_AllDevicesConnected:

       S:='V歟chna zazen?spojena';

     RASCS_Authenticate:

       S:='Za桧naj?se ov禅ovat u瀒vatelsk?informace';

     RASCS_AuthNotify:

       S:='Ov禅en? ozn醡en?;

     RASCS_AuthRetry:

       S:='Ov禅en? opakov醤?;

     RASCS_AuthCallback:

       S:='Ov禅en? zp靦n?vol醤?;

     RASCS_AuthChangePassword:

       S:='Ov禅en? zm靚a hesla';

     RASCS_AuthProject:

       S:='Ov禅en? n醰rh';

     RASCS_AuthLinkSpeed:

       S:='Ov禅en? spojovac?rychlost';

     RASCS_AuthAck:

       S:='Ov禅en? potvrzen?;

     RASCS_ReAuthenticate:

       S:='Ov禅en? znovuov禅en?;

     RASCS_Authenticated:

       S:='Ov禅eno';

     RASCS_PrepareForCallback:

       S:='Pprava na zpetn?vol醤?;

     RASCS_WaitForModemReset:

       S:='萫k?se na reset modemu';

     RASCS_WaitForCallback:

       S:='萫k?se na zp靦n?vol醤?;

     RASCS_Projected:

       S:='Navrhnuto';

     RASCS_StartAuthentication:

       S:='Ov禅ov醤?u瀒vatelsk齝h informac?;

     RASCS_CallbackComplete:

       S:='Zpetn?vol醤?hotovo';

     RASCS_LogonNetwork:

       S:='P鴌pojuje se na s頋';

     RASCS_Interactive:

       S:='Interakce';

     RASCS_RetryAuthentication:

       S:='Opakov醤?ove鴈n?;

     RASCS_CallbackSetByCaller:

       S:='Zpe靦n?vol醤?zvoleno u瀒vatelem';

     RASCS_PasswordExpired:

       S:='Platnost hesla vypr歟la';

     RASCS_Connected:

       S:='Spojeno';

     RASCS_Disconnected:

       S:='Rozpojeno';

   end;

   Result:=S;

 end;

end;

{****************************************************************************}

{****************************************************************************}

{****************************************************************************}

{****************************************************************************}

{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}

function RasCreatePhonebookEntryA; external 'rasapi32.dll' name 'RasCreatePhonebookEntryA';

function RasCreatePhonebookEntryW; external 'rasapi32.dll' name 'RasCreatePhonebookEntryW';

function RasCreatePhonebookEntry;  external 'rasapi32.dll' name 'RasCreatePhonebookEntryA';

function RasDialA;                 external 'rasapi32.dll' name 'RasDialA';

function RasDialW;                 external 'rasapi32.dll' name 'RasDialW';

function RasDial;                  external 'rasapi32.dll' name 'RasDialA';

function RasEditPhonebookEntryA;   external 'rasapi32.dll' name 'RasEditPhonebookEntryA';

function RasEditPhonebookEntryW;   external 'rasapi32.dll' name 'RasEditPhonebookEntryW';

function RasEditPhonebookEntry;    external 'rasapi32.dll' name 'RasEditPhonebookEntryA';

function RasEnumConnectionsA;      external 'rasapi32.dll' name 'RasEnumConnectionsA';

function RasEnumConnectionsW;      external 'rasapi32.dll' name 'RasEnumConnectionsW';

function RasEnumConnections;       external 'rasapi32.dll' name 'RasEnumConnectionsA';

function RasEnumEntriesA;          external 'rasapi32.dll' name 'RasEnumEntriesA';

function RasEnumEntriesW;          external 'rasapi32.dll' name 'RasEnumEntriesW';

function RasEnumEntries;           external 'rasapi32.dll' name 'RasEnumEntriesA';

function RasGetConnectStatusA;     external 'rasapi32.dll' name 'RasGetConnectStatusA';

function RasGetConnectStatusW;     external 'rasapi32.dll' name 'RasGetConnectStatusW';

function RasGetConnectStatus;      external 'rasapi32.dll' name 'RasGetConnectStatusA';

function RasGetEntryDialParamsA;   external 'rasapi32.dll' name 'RasGetEntryDialParamsA';

function RasGetEntryDialParamsW;   external 'rasapi32.dll' name 'RasGetEntryDialParamsW';

function RasGetEntryDialParams;    external 'rasapi32.dll' name 'RasGetEntryDialParamsA';

function RasGetErrorStringA;       external 'rasapi32.dll' name 'RasGetErrorStringA';

function RasGetErrorStringW;       external 'rasapi32.dll' name 'RasGetErrorStringW';

function RasGetErrorString;        external 'rasapi32.dll' name 'RasGetErrorStringA';

function RasGetProjectionInfoA;    external 'rasapi32.dll' name 'RasGetProjectionInfoA';

function RasGetProjectionInfoW;    external 'rasapi32.dll' name 'RasGetProjectionInfoW';

function RasGetProjectionInfo;     external 'rasapi32.dll' name 'RasGetProjectionInfoA';

function RasHangUpA;               external 'rasapi32.dll' name 'RasHangUpA';

function RasHangUpW;               external 'rasapi32.dll' name 'RasHangUpW';

function RasHangUp;                external 'rasapi32.dll' name 'RasHangUpA';

function RasSetEntryDialParamsA;   external 'rasapi32.dll' name 'RasSetEntryDialParamsA';

function RasSetEntryDialParamsW;   external 'rasapi32.dll' name 'RasSetEntryDialParamsW';

function RasSetEntryDialParams;    external 'rasapi32.dll' name 'RasSetEntryDialParamsA';

function RasValidateEntryNameA;  external 'rasapi32.dll' name 'RasValidateEntryNameA';

function RasValidateEntryNameW;  external 'rasapi32.dll' name 'RasValidateEntryNameW';

function RasRenameEntryA;        external 'rasapi32.dll' name 'RasRenameEntryA';

function RasRenameEntryW;        external 'rasapi32.dll' name 'RasRenameEntryW';

function RasDeleteEntryA;        external 'rasapi32.dll' name 'RasDeleteEntryA';

function RasDeleteEntryW;        external 'rasapi32.dll' name 'RasDeleteEntryW';

function RasGetEntryPropertiesA; external 'rasapi32.dll' name 'RasGetEntryPropertiesA';

function RasGetEntryPropertiesW; external 'rasapi32.dll' name 'RasGetEntryPropertiesW';

function RasSetEntryPropertiesA; external 'rasapi32.dll' name 'RasSetEntryPropertiesA';

function RasSetEntryPropertiesW; external 'rasapi32.dll' name 'RasSetEntryPropertiesW';

function RasGetCountryInfoA;     external 'rasapi32.dll' name 'RasGetCountryInfoA';

function RasGetCountryInfoW;     external 'rasapi32.dll' name 'RasGetCountryInfoW';

function RasEnumDevicesA;        external 'rasapi32.dll' name 'RasEnumDevicesA';

function RasEnumDevicesW;        external 'rasapi32.dll' name 'RasEnumDevicesW';

var

 Rnaph_Initialized       : Boolean = False;

 Is_Rnaph                : Boolean = False;

 Lib                     : HModule;

{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}

function Rnaph_(const func: String): Pointer;

begin

 if not Rnaph_Initialized then

 begin

   // Try first with RASAPI32.DLL

   Lib:=LoadLibrary('rasapi32.dll');

   if Lib<>0 then

   begin

     Result:=GetProcAddress(Lib, PChar(Func+'A'));

     if Result<>nil then

     begin

       Rnaph_Initialized:=True;

       Exit;

     end;

   end else raise Exception.Create('Error opening rasapi.dll');

   // function not found - try rnaph.dll

   Lib:=LoadLibrary('rnaph.dll');

   if Lib<>0 then

   begin

     Result:=GetProcAddress(Lib, PChar(Func));

     if Result <> nil then

     begin

       Rnaph_Initialized:=True;

       Is_Rnaph:=True;

       Exit;

     end else raise Exception.Create('Function '+Func+' not found!');

   end else raise Exception.Create('Error opening rnaph.dll');

 end else

 begin

   if Is_Rnaph then Result:=GetProcAddress(Lib,PChar(Func))

   else Result:=GetProcAddress(lib,PChar(Func+'A'));

   if Result=nil then raise Exception.Create('Function '+Func+' not found!');

 end;

end;

{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}

function RasValidateEntryName(lpszPhonebook, szEntry: PAnsiChar): Longint;

var

 F      : Function(lpszPhonebook, szEntry: PAnsiChar): Longint; stdcall;

begin

 @F:=Rnaph_('RasValidateEntryName');

 Result:=F(lpszPhonebook, szEntry);

end;

{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}

function RasRenameEntry(lpszPhonebook, szEntryOld, szEntryNew: PAnsiChar): Longint;

var

 F      : function(lpszPhonebook, szEntryOld, szEntryNew: PAnsiChar): Longint; stdcall;

begin

 @F:=rnaph_('RasRenameEntry');

 Result:=F(lpszPhonebook, szEntryOld, szEntryNew);

end;

{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}

function RasDeleteEntry(lpszPhonebook, szEntry: PAnsiChar): Longint;

var

 F      : function(lpszPhonebook, szEntry: PAnsiChar): Longint; stdcall;

begin

 @F:=Rnaph_('RasDeleteEntry');

 Result:=F(lpszPhonebook, szEntry);

end;

{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}

function RasGetEntryProperties(lpszPhonebook, szEntry: PAnsiChar; lpbEntry: Pointer;

   var lpdwEntrySize: Longint; lpbDeviceIn