关注。
我也写过一个数据传输程序,用的是这种方式(太费事):
调用RAS函数,通过拨号连接拨号。我有这个拨号控件源码。
服务器为Win2K Server,建立一个“传入的连接”,接受拨号、登录。
服务器启动FTP程序,客户端使用FTP组件,接入服务器,开始文件传输。

解决方案 »

  1.   

    我有个完整的拨好程序提供源码,希望对你有用
    http://www.csdn.net/expert/topic/169/169977.shtm
      

  2.   

    (****************************************** |******************************************
     *  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 :
    // [email protected], 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: [email protected] DialUp;interfaceuses
      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 <[email protected]> }
    (*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 <[email protected]>
    (*RASAPI*)   Merged with ras.pas by Davide Moretti <[email protected]>
    (*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 enoughtype  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;implementationvar 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(lpszP