Delphi

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


while pAdapt<>nil do

begin

case pAdapt.Type_ of

MIB_IF_TYPE_ETHERNET:

AdapterCB.Items.Add('Ethernet adapter '+pAdapt.AdapterName);

MIB_IF_TYPE_TOKENRING:

AdapterCB.Items.Add('Token Ring adapter '+pAdapt.AdapterName);

MIB_IF_TYPE_FDDI:

AdapterCB.Items.Add('FDDI adapter '+pAdapt.AdapterName);

MIB_IF_TYPE_PPP:

AdapterCB.Items.Add('PPP adapter '+pAdapt.AdapterName);

MIB_IF_TYPE_LOOPBACK:

AdapterCB.Items.Add('Loopback adapter '+pAdapt.AdapterName);

MIB_IF_TYPE_SLIP:

AdapterCB.Items.Add('Slip adapter '+pAdapt.AdapterName);

MIB_IF_TYPE_OTHER:

AdapterCB.Items.Add('Other adapter '+pAdapt.AdapterName);

end;

pAdapt := pAdapt.Next;

end;

GlobalFree(Cardinal(pFixedInfo));

end;

Я постарался снабдить код подробными комментариями, чтобы ты мог разобраться с тем, что здесь происходит. Самое сердце этой процедуры - вызов функции GetAdaptersInfo. Первый раз я вызываю ее с нулевым первым параметром. Это заставляет ОС передать нам количество памяти, необходимой для хранения информации об установленных устройствах. Эту информацию я получаю через переменную, указанную во втором параметре. После этого я выделяю необходимое количество памяти. Память выделяется с помощью функции GlobalAlloc, которая выделяет память в глобальной памяти машины.

Во второй раз функция GetAdaptersInfo вызывается уже со всеми нормальными параметрами. В первом я указал на выделенную память, а второй параметр указывает на количество этой памяти. Теперь у нас выпадающий список ComboBox содержит всю необходимую информацию о количестве установленных устройствах и их типе. Можно переходить к следующему этапу.

Информация об устройстве

Здесь я не буду показывать абсолютно все, так как объем рубрики не позволяет, а только расскажу самое интересное.

У нас в выпадающем списке ComboBox находятся имена всех найденных устройств, и нам надо ловить событие, когда юзер выбрал какой-то элемент из списка, и выводить информацию, относящуюся к этому элементу. Чтобы поймать такое событие, мы должны создать обработчик OnChange для выпадающего списка. В этом обработчике нам надо получить количество установленных устройств. Для этого вызываем функцию GetAdaptersInfo с нулевым первым параметром, чтобы узнать количество необходимой памяти для хранения информации об устройствах:

AdapterInfoSize:=0;

Err:=GetAdaptersInfo(nil, AdapterInfoSize);

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

Далее я снова получаю список устройств:

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

Назад на стр. 047-078-1  Содержание  Вперед на стр. 047-078-3