Форум: "Начинающим";
Текущий архив: 2009.08.02;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.007 c