Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.08.02;
Скачать: CL | DM;

Вниз

Domain_name_IP_Traffic   Найти похожие ветки 

 
jonin   (2009-06-06 21:26) [40]

извиняюсь за написание) поторопился
дак ты разбираешься очень хорошо, а я только начинаю изучать
а гденибудь можно про этот код прочитать или про примерно похожий? потому что в книгах с коментариями пишут а в интернете половина без(


 
jonin   (2009-06-06 21:31) [41]

TGetIfTable = function(pIfTable: PMibIfTable; pdwSize: PULONG; bOrder: Boolean): DWORD; stdcall; а вот что что функция делает?


 
Сергей М. ©   (2009-06-07 10:06) [42]

Это не функция, а декларация (объявление) ее прототипа.
Код самой ф-ции находится в iphlpapi.dll.
Эта библиотека экспортирует (публикует) текстовый идентификатор "GetIfTable", по которому после загрузки этой dll с пом., например, ф-ции GetProcAddress() можно получить точку входа (адрес начальной инструкции) в эту функцию и присвоить полученное значение некоей переменной MyGetIfTable, имеющей тип TGetIfTable. Последующие операторы вида
MyResult := MyGetIfTable(фактические параметры)
указывают компилятору на необходимость вызова ф-ции, адрес которой находится в переменной MyGetIfTable.
Ф-ция iphlpapi.GetIfTable предназначена для получения мгновенного информационного "снимка", содержащего таблицу текущего состояния сетевых интерфейсов. Каждая строка таблицы содержит структурированные данные, описывающие отдельный интерфейс и его тек.состояние.

http://www.xakep.ru/magazine/xa/100/116/1.asp


 
jonin   (2009-06-07 12:15) [43]

а дальше описываються переменные которые в этой длл используються?


 
jonin   (2009-06-07 13:03) [44]

procedure TForm1.Button6Click(Sender: TObject);
begin
if Timer1.Enabled then begin
 Timer1.Enabled := False;
 SetLength(IfData, 0); // вот здесь что делаеться?
 FreeLibrary(FLibHandle);
end
else
begin
 FLibHandle := LoadLibrary("IPHLPAPI.DLL"); // загружаем библиотеку
 Win32Check(FLibHandle <> 0);
 GetIfTable:=GetProcAddress(FLibHandle, "GetIfTable"); //  здесь что происходит
 Win32Check(Assigned(@GetIfTable)); //  и здесь
 Timer1.Interval := 1000;
 Timer1.Enabled := True;
end;
end;

end;


 
Сергей М. ©   (2009-06-07 14:16) [45]


> GetIfTable:=GetProcAddress(FLibHandle, "GetIfTable"); //
>  здесь что происходит


Здесь происходит получение точки входа (адреса) функции, которую библиотека экспортирует (публикует) под именем "GetIfTable", и присвоение полученного значения переменной с именем GetIfTable.


> Win32Check(Assigned(@GetIfTable)); //  и здесь


См. выше - полученное значение является действительным адресом (действительным указателем) интересующей функции "GetIfTable" , если оно <> 0 (not nil),
В противном случае (nil) это значение говорит о некоей ошибке, возникшей при выполнении ф-ции GetProcAddress, код которой м.б. тут же получен вызовом ф-ции GetLastError, а текстовое ее описание - вызовом  УSysErrorMessage(GetLastError)

Псевдофункция Assigned() возвращает True, если ее аргумент <> nil, иначе возвращает False.

Функция Win32Check не делает ничего, если ее аргумент равен True, в противном случае возбуждает исключительную ситуацию класса EWin32Error.


 
Palladin ©   (2009-06-07 14:18) [46]


> GetIfTable:=GetProcAddress(FLibHandle, "GetIfTable"); //
>  здесь что происходит

Происходит вызов функции GetProcAddress


> Win32Check(Assigned(@GetIfTable)); //  и здесь

Происходит вызов процедуры Win32Check


 
jonin   (2009-06-08 12:36) [47]

function GetUpdatedIfDataItem(var AMAC: TMAC; ASent, ARcvd: DWord): PIfDataItem; // здесь вызываетьсся функция из dll библиотеки?
begin
Result := GetItemByMAC(AMAC); //здесь ее результат
with Result^ do
begin // а вот что в этих 4 строчках происходит?
 SentDelta := Max(ASent - SentAmount, 0);
 RcvdDelta := Max(ARcvd - RcvdAmount, 0);
 SentAmount := ASent;
 RcvdAmount := ARcvd;
end;
end;


 
jonin   (2009-06-09 18:10) [48]

( чтото некто даже не подскадет


 
Сергей М. ©   (2009-06-09 21:26) [49]


> function GetUpdatedIfDataItem(var AMAC: TMAC; ASent, ARcvd:
>  DWord): PIfDataItem; // здесь вызываетьсся функция из dll
> библиотеки?


Нет тут никакого вызова никакой ф-ции из dll

> а вот что в этих 4 строчках происходит?



> SentDelta := Max(ASent - SentAmount, 0);


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


> RcvdDelta := Max(ARcvd - RcvdAmount, 0);


тоже самое, но для принятых байт.


>  SentAmount := ASent;
>  RcvdAmount := ARcvd;



>  SentAmount := ASent;
>  RcvdAmount := ARcvd;


Текущие показания сохраняются., при следующем чтении таблицы интерфейсов эти сохраненные показания будут считаться предудущими (для расчета разниц, см. выше)



Страницы: 1 2 вся ветка

Текущий архив: 2009.08.02;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.011 c
2-1244472613
lewka
2009-06-08 18:50
2009.08.02
Работа в Word


15-1243504952
Petr V. Abramov
2009-05-28 14:02
2009.08.02
Иллюстрации в детской книжке


15-1243854690
Тимохов_
2009-06-01 15:11
2009.08.02
Работа с XCHG и LOCK


15-1243599379
TheEd
2009-05-29 16:16
2009.08.02
в компонентах тема не катит, а в БД обсуждение закрыли, короче:


15-1243316997
Jungle
2009-05-26 09:49
2009.08.02
Программно-аппаратная защита