Delphi2009, использование библиотеки IpHlpApi.dll
Пишу программку на Delphi2009. Частью программы является просмотр исходящего и входящего траффика ADSL-соединения. Хочу использовать IpHlpAPI.dll - библиотеку, которую, казалось бы, и использую, но не так успешно, как хотелось бы. Исходник:
Код:
procedure TMainForm.Timer1Timer(Sender: TObject);
var
Table : TMibIfTable;
FLibHandle : THandle;
i : Integer;
Size : Integer;
begin
application.processmessages();
wget;
lvTraffic.Items.BeginUpdate;
lvTraffic.Items.Clear; //Очищаем список
FLibHandle := LoadLibrary('IPHLPAPI.DLL'); //Загружаем библиотеку
if FLibHandle = 0 then Exit;
@GetIfTable := GetProcAddress(FLibHandle, 'GetIfTable');
if not Assigned(GetIfTable) then
begin
FreeLibrary(FLibHandle);
Close;
end;
Size := SizeOf(Table);
if GetIfTable(@Table, @Size, False ) = 0 then //Выполняем функцию
for i:= 0 to Table.dwNumEntries-1 do begin
with lvTraffic.Items.Add do begin //Выводим результаты
Caption := String(Table.Table.bDescr); //Наименование интерфейса
SubItems.Add(GetMAC(TMAC(Table.Table.bPhysAddr),
Table.Table.dwPhysAddrLen)); //MAC адрес
SubItems.Add(IntToStr(Table.Table.dwInOctets)); //Всего принято байт
SubItems.Add(IntToStr(Table.Table.dwOutOctets)); //Всего отправлено байт
end;
end;
lvTraffic.Items.EndUpdate;
FreeLibrary(FLibHandle);
end;
var
Table : TMibIfTable;
FLibHandle : THandle;
i : Integer;
Size : Integer;
begin
application.processmessages();
wget;
lvTraffic.Items.BeginUpdate;
lvTraffic.Items.Clear; //Очищаем список
FLibHandle := LoadLibrary('IPHLPAPI.DLL'); //Загружаем библиотеку
if FLibHandle = 0 then Exit;
@GetIfTable := GetProcAddress(FLibHandle, 'GetIfTable');
if not Assigned(GetIfTable) then
begin
FreeLibrary(FLibHandle);
Close;
end;
Size := SizeOf(Table);
if GetIfTable(@Table, @Size, False ) = 0 then //Выполняем функцию
for i:= 0 to Table.dwNumEntries-1 do begin
with lvTraffic.Items.Add do begin //Выводим результаты
Caption := String(Table.Table.bDescr); //Наименование интерфейса
SubItems.Add(GetMAC(TMAC(Table.Table.bPhysAddr),
Table.Table.dwPhysAddrLen)); //MAC адрес
SubItems.Add(IntToStr(Table.Table.dwInOctets)); //Всего принято байт
SubItems.Add(IntToStr(Table.Table.dwOutOctets)); //Всего отправлено байт
end;
end;
lvTraffic.Items.EndUpdate;
FreeLibrary(FLibHandle);
end;
Вся соль в том, что код работает исправно. Но вот разница между результатом в Delphi7 и Delphi2009 огромная.
Кто-нибудь сможет помочь? Или если с этим вариантом все безнадежно, может есть другие рабочие? Заранее благодарю.
Вы учитываете что 2009-юникод, а 7-ка - Ansi?
Разница в результате. Если я компилю этот код на Dlephi7, то я получаю 4 различных интерфейса и требуемую статистику по ним. Если на Delphi2009, то получаю название только одного интерфейса, мак по нему и ноль по входящему и исходящему трафику. Ну и плюс еще два-три интерфейса с пустым названием, маками типа 00-00-00-00-00-00 и нулями в трафике.
Думаю вам следует проанализировать описание структуры TMibIfTable.
Цитата: Phodopus
Правильно я понял что в 2009 результат неверный?
Да, именно так.
Цитата: Phodopus
Думаю вам следует проанализировать описание структуры TMibIfTable.
Благодарю, но каким именно образом? Меня просто смущает то, что код один, язык object pascal, библиотека одна и та же, но результат разный.
http://img4.imageshack.us/my.php?image=31072304.jpg
Во втором варианте заметил одну особенность: скажем, если я выключу свою WLAN, то видно будет следующее по очереди подключение(простое LAN), количество уменьшится на 1, остальные останутся пустыми.
есть определенное подозрение на объявление
BYTE bPhysAddr[MAXLEN_PHYSADDR];
и
BYTE bDescr[MAXLEN_IFDESCR];
в pas-овском модуле у вас они могут быть объявлены как char
спасло изменение типа массива bDescr в структуре TMibIfTable с char на AnsiChar.
Прошу прощения за невнимательность.
загрузить IpHlpApi.dll файл и получить решение.
Если файл IpHlpApi.dll не работает на компьютере, вам необходимо легко