В WIN9X, если установлена коммутируемая сеть, в системном каталоге системы WINDOWS будут две библиотеки управления коммутируемой сетью, RasApi32.DLL и RasApi16.DLL. Мы можем использовать в них функции серии RAS. получить и настроить коммутируемые соединения. Конечно, вы можете получить динамический IP-адрес коммутируемого соединения. В файле справки Delphi есть подробные описания связанных функций RAS.
---- 1. Сначала объясните некоторые используемые константы данных и структуры данных.
constRAS_MaxDeviceType = 16; // Длина имени типа устройства RAS_MaxEntryName = 256; // Максимальная длина имени соединения RAS_MaxDeviceName = 128; // Максимальная длина имени устройства RAS_MaxIpAddress = 15; // Максимальная длина IP-адреса Rasp_PppIp = $8021; Тип протокола соединения, это значение указывает тип соединения PPPHRASCONN = DWord;//Тип дескриптора коммутируемого соединения RASCONN = запись //Дескриптор и информация о настройках активного коммутируемого соединения dwSize: DWORD;//Размер памяти, занимаемой этой структурой (байты), обычно устанавливается в SizeOf( RASCONN) hrasconn: HRASCONN ;//Дескриптор активного соединения szEntryName: array[0..RAS_MaxEntryName] of char; //Имя активного соединения szDeviceType: array[0..RAS_MaxDeviceType] of char;//Тип устройства, используемый для активных соединений szDeviceName : array[0..RAS_MaxDeviceName] of char;//Имя устройства, используемое для активных соединений end;TRASPPPIP = запись//Активный набор- вверх Информация о подключенном динамическом IP-адресе dwSize: DWORD;//Размер памяти, занимаемой этой структурой (в байтах), обычно устанавливается равным SizeOf(TRASPPPIP) dwError: DWORD;//Идентификатор типа ошибки szIpAddress: array[0..RAS_MaxIpAddress] of char;//IP-адрес конца активного коммутируемого соединения;
---- 2. Далее мы объясним две используемые функции RAS.
//Получаем информацию обо всех активных коммутируемых соединениях (дескриптор соединения и информацию о настройках) function RasEnumConnections( var lPRasconn : RASCONN ; // Получаем указатель буфера активных соединений var lpcb: DWORD; // Размер буфера var lpcConnections : DWORD // фактическое количество активных соединений): DWORD; stdcall; функция RasEnumConnections; внешнее имя Rasapi32.dll. 'RasEnumConnectionsA';//Получите динамическую информацию IP указанной активной функции коммутируемого соединения RasGetProjectionInfo(hrasconn: HRasConn;//Укажите дескриптор rasprojection активного соединения: DWORD;//Тип соединения RAS var lpprojection: TRASPPPIP;/ /Получить динамическую IP-информацию Buffer var lpcb: DWord//получить размер буфера): DWORD;stdcall;function RasGetProjectionInfo; внешнее имя Rasapi32.dll «RasGetProjectionInfoA»;
Когда возвращаемое значение этих двух функций равно 0, это указывает на успешное выполнение, а ненулевое значение указывает на код ошибки.
---- 3. Далее мы обсудим, как использовать две функции RAS, описанные выше, для получения динамического IP-адреса коммутируемого соединения.
---- Сначала используйте функцию RasEnumConnections для получения списка информации об установленных активных коммутируемых соединениях, включая имя соединения, дескриптор соединения, тип устройства подключения и имя устройства, затем используйте функцию RasGetProjectionInfo для получения структуры TRASPPPIP, соответствующей; соединение на основе дескриптора соединения, который включает атрибут члена szIpAddress, который является динамическим IP-адресом. Подробности смотрите в следующих фрагментах программы и аннотационной информации.
процедура TForm1.Button1Click(Sender: TObject);const MaxConnections = 10;//Предположим, что имеется до 10 активных коммутируемых соединений var Connections: array[0..MaxConnections-1] of RASCONN //Коммутируемое соединение; array longSize: dword; intAvailabelConnections : dword; // Фактическое количество активных коммутируемых соединений intIndex : strTemp : string; dwResult : DWORD; dwSize : DWORD; RASpppIP : TRASPPPIP;//Информация о динамическом IP-адресе активных коммутируемых подключений. //Размер буфера для приема активных соединений intAvailabelConnections := 0; //Получить информацию обо всех активных коммутируемых соединениях (дескриптор соединения и информацию о настройках) dwResult := RasEnumConnections( Connections[0 ], longSize,intAvailabelConnections ); if 0 < > dwResult then memo1.lines.add( 'Error:' +); inttostr ( dwResult ) ) else start memo1.lines.add( 'Существуют активные соединения' + IntToStr( intAvailabelConnections ) + 'one'); // Отображение информации обо всех активных коммутируемых соединениях (информация о настройках и динамический IP-адрес) для intIndex := от 0 до intAvailabelConnections - 1 do Begin // Отображение информации о настройках активного коммутируемого соединения. up соединение strTemp: = 'Имя соединения:' + StrPAS( Connections[ intIndex ].szEntryName ) + ', Тип устройства: ' + StrPAS( Connections[ intIndex ].szDeviceType ) + ', имя устройства: ' + StrPAS( Connections[ intIndex ].szDeviceName ); memo1.lines.add( strTemp ); //Отображение динамического IP-адреса активного коммутируемого соединения dwSize := SizeOf( RASpppIP) ; RASpppIP.dwSize := dwSize; dwResult := RASGetProjectionInfo( Connections[ intIndex ].hRasConn,RASP_PppIp,RasPPPIP,dwSize);//Получить динамический IP-адрес if 0 < > dwResult then memo1.lines.add('Error:' + inttostr( dwResult )) else memo1.lines.add( 'Динамический адрес: ' + StrPas(RASpppIP.szIPAddress)); конец;конец;