Por ahora te dejo un ejemplo de como obtener la ip, la mascara, la MAC y la descripción del interface. La Gateway te la dejo a ti:
Es una aplicación de consola:
Código Delphi
[-]
program ipview;
{$APPTYPE CONSOLE}
uses Windows, SysUtils;
const
MAX_INTERFACE_NAME_LEN = 256;
MAXLEN_PHYSADDR = 8;
MAXLEN_IFDESCR = 256;
type
PMIB_IPADDRROW = ^TMIB_IPADDRROW;
TMIB_IPADDRROW = packed record
dwAddr: DWORD;
dwIndex: DWORD;
dwMask: DWORD;
dwBCastAddr: DWORD;
dwReasmSize: DWORD;
unused1: SmallInt;
wType: SmallInt;
end;
PMIB_IPADDRTABLE = ^TMIB_IPADDRTABLE;
TMIB_IPADDRTABLE = record
dwNumEntries: DWORD;
table: array[0..0] of TMIB_IPADDRROW;
end;
PMIB_IFROW = ^TMIB_IFROW;
TMIB_IFROW = record
wszName: array[1..MAX_INTERFACE_NAME_LEN] of WCHAR;
dwIndex: DWORD;
dwType: DWORD;
dwMtu: DWORD;
dwSpeed: DWORD;
dwPhysAddrLen: DWORD;
bPhysAddr: array[1..MAXLEN_PHYSADDR] of Byte;
dwAdminStatus: DWORD;
dwOperStatus: DWORD;
dwLastChange: DWORD;
dwInOctets: DWORD;
dwInUcastPkts: DWORD;
dwInNUcastPkts: DWORD;
dwInDiscards: DWORD;
dwInErrors: DWORD;
dwInUnknownProtos: DWORD;
dwOutOctets: DWORD;
dwOutUcastPkts: DWORD;
dwOutNUcastPkts: DWORD;
dwOutDiscards: DWORD;
dwOutErrors: DWORD;
dwOutQLen: DWORD;
dwDescrLen: DWORD;
bDescr: array[1..MAXLEN_IFDESCR] of Byte;
end;
function GetIpAddrTable(IpAddrTable: PMIB_IPADDRTABLE; pdwSize: PULONG;
Order: BOOL): DWORD; stdcall; external 'iphlpapi.dll' name 'GetIpAddrTable';
function GetIfEntry(pIfRow: PMIB_IFROW): DWORD;
stdcall; external 'iphlpapi.dll' name 'GetIfEntry';
function IpToStr(Ip: DWORD): string;
begin
Result:= Format('%d.%d.%d.%d',
[IP and $FF,(IP shr 8) and $FF,(IP shr 16) and $FF,(IP shr 24) and $FF]);
end;
function PhysAddrToStr(PhysAddr: PByte; Len: DWORD): string;
begin
Result:= EmptyStr;
while Len > 0 do
begin
Result:= Result + IntToHex(PhysAddr^,2);
inc(PhysAddr);
dec(Len);
end;
end;
procedure Ejemplo;
var
IfRow: TMIB_IFROW;
Table: PMIB_IPADDRTABLE;
Size: DWORD;
i: Integer;
begin
GetMem(Table, Sizeof(TMIB_IPADDRTABLE));
try
Size:= Sizeof(TMIB_IPADDRTABLE);
if GetIpAddrTable(Table, @Size, FALSE) = ERROR_INSUFFICIENT_BUFFER then
begin
FreeMem(Table);
GetMem(Table,Size);
end;
FillChar(Table^,Size,0);
if GetIpAddrTable(Table, @Size, FALSE) = NO_ERROR then
begin
for i:= 0 to Table.dwNumEntries - 1 do
begin
FillChar(IfRow,Sizeof(IfRow),0);
IfRow.dwIndex:= Table.table[i].dwIndex;
if GetIfEntry(@IfRow) = NO_ERROR then
with IfRow do
begin
Writeln('Descripcion: ' + Copy(String(PChar(@bDescr)),1,dwDescrLen));
Writeln('Physical address: ' + PhysAddrToStr(@bPhysAddr,dwPhysAddrLen));
end;
with Table.table[i] do
begin
Writeln('Address: ' + IpToStr(dwAddr));
Writeln('Mask: ' + IpToStr(dwMask));
Writeln;
end;
end;
end;
finally
FreeMem(Table);
end;
end;
begin
Ejemplo;
Writeln('Pulsa una para terminar ...');
Readln;
end.