Главная страница
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.01 c
3-1225226858
jiny
2008-10-28 23:47
2009.08.02
DBGridEh &amp; поддержка Unicode


15-1243972463
Самовар
2009-06-02 23:54
2009.08.02
Литература


15-1243538953
Саша
2009-05-28 23:29
2009.08.02
как защитить программу от взлома?


3-1225144232
Раиса
2008-10-28 00:50
2009.08.02
MySQL и SSH Tunneling - какие компоненты


15-1243456205
Юрий
2009-05-28 00:30
2009.08.02
С днем рождения ! 28 мая 2009 четверг