Delphi

Xakep, номер #047, стр. 047-078-1


IP Config. Часть 2

Horrific aka Фленов Михаил (smirnandr@mail.ru)

www.cydsoft.com/vr-online

Сегодня я закончу рассказ, начатый в позапрошлом номере ][. А именно - мы напишем полноценный вариант программы IP Config. Напоминаю, что в прошлый раз мы создали форму и поместили на нее компонент TPageControl с двумя закладками. Мы научились получать от системы все, что находится на первой закладке, и теперь осталось только заполнить вторую закладку полезной инфой.

Сегодня нам предстоит познакомиться с самым интересным - мы научимся получать из системы количество установленных сетевых устройств и их свойства. Среди этих свойств будет определение IP-адреса и маски сети. Только что я зашел в свой TheBat и понял, что вопрос о том, как определить IP-адрес, чуть ли не самый популярный. Но я эту тему пока не затрагивал в журнале, потому что способ, который я сегодня покажу, будет достаточно сложным. Зато он позволяет определить IP и маску любого сетевого устройства, установленного в системе.

Design time

Открой пример, который мы написали в позапрошлой статье, и подкорректируй вторую закладку, как на рисунке 1. На этой закладке у меня вверху расположен компонент TComboBox, в котором будет список установленных в системе сетевых устройств. Чуть ниже находится компонент TListView, у которого нужно установить следующие свойства:

Name - изменим имя компонента на IPListView.

ViewStyle - здесь нужно указать vsReport.

Columns - здесь нужно создать две колонки с именами IP Address и Subnet Mask (IP-адрес и маска сети). Я люблю писать такие вещи на английском языке, но если хочешь, то можешь писать хоть на китайском.

Дальше идут компоненты TLabel, в которых мы будем выводить полученную из системы информацию.

Список устройств

Теперь научимся получать список установленных в системе сетевых устройств. Я советую это делать по событию OnShow для формы. В этом случае проверка будет происходить только при появлении формы, а потом мы будем лишь получать информацию об уже выбранном устройстве. Где-то я видел тулзу, которая обновляла этот список при каждом обращении пользователя к любому элементу. Лично я не понял в этом смысла. Если ты считаешь, что за время выполнения программы список может измениться (например, включили новое USB устройство), то для таких случаев лучше добавить кнопку "Обновить" и не мучить пользователя бесполезными задержками.

Итак, по событию OnShow для главной формы пишем следующий код:

procedure TSystemInfoForm.FormShow(Sender: TObject);

var

pAdapterInfo, pAdapt:PIP_ADAPTER_INFO;

pAddrStr:PIP_ADDR_STRING;

begin

//Очищаю список устройств

AdapterCB.Items.Clear;

//Получить количество устройств

AdapterInfoSize:=0;

Err:=GetAdaptersInfo(nil, AdapterInfoSize);

//Если произошла ошибка, то...

if (Err<>0) and (Err<>ERROR_BUFFER_OVERFLOW) then

begin

AdapterCB.Items.Add('Error');

exit;

end;

//Получить информацию об устройствах.

pAdapterInfo := PIP_ADAPTER_INFO(GlobalAlloc(GPTR, AdapterInfoSize));

GetAdaptersInfo(pAdapterInfo, AdapterInfoSize);

pAdapt := pAdapterInfo;

//Проверяю тип полученного адаптера

Содержание  Вперед на стр. 047-078-2