unit GetIf;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
const
MAX_INTERFACE_NAME_LEN = $100;
// maximale Länge Name des Interfaces
MAXLEN_PHYSADDR = 8;
// maximale Länge der physischen Adresse
MAXLEN_IFDESCR = $100;
// maximale Länge Beschreibung des Int.
type
TMIB_IFROW =
record
wszName :
array [0 .. (MAX_INTERFACE_NAME_LEN*2-1)]
of char;
dwIndex : cardinal;
// index of the interface
dwType : Longint ;
// type of interface
dwMtu : Longint ;
// max transmission unit
dwSpeed : Longint ;
// speed of the interface
dwPhysAddrLen : Longint ;
// length of physical address
bPhysAddr :
array [0 .. (MAXLEN_PHYSADDR-1)]
of byte ;
// physical address of adapter
dwAdminStatus : Longint ;
// administrative status
dwOperStatus : Longint ;
// operational status
dwLastChange : Longint ;
// last time operational status changed
dwInOctets : Longint ;
// octets received
dwInUcastPkts : Longint ;
// unicast packets received
dwInNUcastPkts : Longint ;
// non-unicast packets received
dwInDiscards : Longint ;
// received packets discarded
dwInErrors : Longint ;
// erroneous packets received
dwInUnknownProtos : Longint ;
// unknown protocol packets received
dwOutOctets : Longint ;
// octets sent
dwOutUcastPkts : Longint ;
// unicast packets sent
dwOutNUcastPkts : Longint ;
// non-unicast packets sent
dwOutDiscards : Longint ;
// outgoing packets discarded
dwOutErrors : Longint ;
// erroneous packets sent
dwOutQLen : Longint ;
// output queue length
dwDescrLen : Longint ;
// length of bDescr member
bDescr :
array[0 .. (MAXLEN_IFDESCR-1)]
of char ;
// interface description
End;
TifTable =
record
nRows : LongInt;
// Anzahl Interfaces
ifRow :
array[1..20]
of TMIB_IFROW;
// mehr als 20 sollten es aber nicht sein!
end;
var pIfTable : ^TifTable;
// ein Pointer auf eine Interfacetabelle
L :
record // L ist ein Record für das Auslesen der Werte
cbRequired : Longint;
// wird gebraucht, um die benötigte Buffer-Größe zu ermitteln
nStructSize : LongInt;
tmp :
String;
end;
cCode : Word;
// Einbinden der Funktion aus iphlpapi, um empfangene und gesendete Bytes und die Interfaces-Stats zu holen
function GetIfTable(pIfRowTable: Pointer ;
var pdwSize : Longint; bOrder : LongInt): Longint;
stdcall;
function GetIfTable;
external '
iphlpapi'
name '
GetIfTable';
procedure testLauf;
implementation
procedure testLauf;
var i: integer;
begin
pIfTable :=
nil;
// Zeiger auf eine Struktur des Types TIFTable
ZeroMemory(@L, sizeof(L));
// schauen, wie gross die Tabelle ist..
cCode := GetIfTable(pIfTable, L.cbRequired,1);
if (L.cbRequired <=0)
{ or (L.cbRequired>sizeof(TifTable)) } then exit;
// Mem allokieren und IP-Table empfangen...
GetMem(pIfTable, L.cbRequired);
ZeroMemory(pIfTable, L.cbrequired);
cCode := GetIfTable(pIfTable, L.cbRequired, 1);
if cCode <> ERROR_SUCCESS
then
begin
showmessage ('
Fehler beim Funktionsaufruf') ;
exit;
end;
for i:= 1
to pIfTable^.nRows
do begin // nRows ist die Anzahl der Interfaces
Form3.Memo1.Lines.Add(pIfTable^.ifRow[i].bDescr);
Form3.Memo1.Lines.Add(pIfTable^.ifRow[i].wszName);
Form3.Memo1.Lines.Add('
dwOperStatus: '+IntToStr(pIfTable^.ifRow[i].dwOperStatus));
Form3.Memo1.Lines.Add('
');
end;
freemem(piftable,sizeof(piftable));
end;
end.