Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Интернет и Web


Автор: z-END 13.3.2003, 19:58
withstupid.gif
Как оперделить IP-Адреса и порты всех установленных соединений на моем компьютере.

Автор: <Spawn> 14.3.2003, 00:28
GetTcpTable, GetUdpTable

Автор: <Spawn> 14.3.2003, 02:14
Импорт GetTcpTable

Код

unit TcpTable;

interface

type
PDWord=^Longword;

PMIB_TCPROW=^TMIB_TCPROW;

TMIB_TCPROW=record
 dwState:LongWord;
 dwLocalAddr:LongWord;
 dwLocalPort:LongWord;
 dwRemoteAddr:LongWord;
 dwRemotePort:LongWord;
end;

PMIB_TCPTABLE=^TMIB_TCPTABLE;

TMIB_TCPTABLE=record
 dwNumEntries:LongWord;
 table:array[0..0] of TMIB_TCPROW;
end;

function GetTcpTable(var TcpTable:PMIB_TCPTABLE;var Size:PDWord;bOrder:Boolean):LongWord;stdcall

implementation

function GetTcpTable;     external 'Iphlpapi.dll' name 'GetTcpTable';


end.


Вызов GetTcpTable

Код

   {$R-}
   Entries:=16;
   Sz:=SizeOf(TMIB_TCPTABLE)+SizeOf(TMIB_TCPROW)*(Entries-1);
   pMibTable:=nil;
   try
    repeat
      ReallocMem(pMibTable,Sz);
      Res:=GetTcpTable(pMibTable^,Sz,False);
    until Res <> ERROR_INSUFFICIENT_BUFFER;
    if Res <> NO_ERROR then
     begin
      ShowMessage(SysErrorMessage(Res));
      exit;
     end;
    for Entries:=0 to pMibTable.dwNumEntries-1 do
     begin
        <Делать что-то>
     end;
   finally
    FreeMem(pMibTable);
   end;
  {$R+}

Автор: z-END 15.3.2003, 04:25

Почему-то данный код неработает...

Во-первых SizeOF() - возвращает значение типа Integer, хотя переменная Sz типа ^LongWord.
Во-вторых при экспортировании ф-ции GetTcpTable необходим pMibTable, тогда почему при ее вызове используется указатель "pMibTable^"
Вообщем я неразобрался... если кто-может то хотелось-бы чтобы объснили..

Автор: <Spawn> 15.3.2003, 05:07
Цитата(nJIaKca @ 14.3.2003, 20:25)
Почему-то данный код неработает...

Во-первых SizeOF() - возвращает значение типа Integer, хотя переменная Sz типа ^LongWord.
Во-вторых при экспортировании ф-ции GetTcpTable необходим pMibTable, тогда почему при ее вызове используется указатель "pMibTable^"
Вообщем я неразобрался... если кто-может то хотелось-бы чтобы объснили..

Res:DWORD;
Sz:DWord;
pMibTable:PMIB_TCPTABLE;

Ты такие переменные задал?

Автор: z-END 15.3.2003, 05:21
Переменные то те, а вот здесь
Цитата
    Res:=GetTcpTable(pMibTable^,Sz,False);

Компилятор выдает 2 ошибки:
1 - pMibTable^ - [Error] Unit1.pas(44): Types of actual and formal var parameters must be identical
т.e. работает если использовать pMibTable без"^"
2 - Sz [Error] Unit1.pas(44): Types of actual and formal var parameters must be identical
а вот здесь что делать неясно... т.к. при использовании PDWord(Sz) компиляция проходит нормально, но при обращении
Цитата
    for Entries:=0 to pMibTable.dwNumEntries-1 do
    begin
        <Делать что-то>
    end;

ошибка read of address FFFFFFFF т.е. pMibTable.dwNumEntries- nil
В чем я опять ошибся?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)