uses SysUtils, CommCtrl, ...;
const
IPHLPAPI = 'IPHLPAPI.DLL';
type
// Так будет выглядеть МАС
TMacAddress = array[0..MAX_ADAPTER_ADDRESS_LENGTH] of byte;
// Это структура для единичного запроса
TMibIPNetRow = packed record
dwIndex : DWORD;
dwPhysAddrLen : DWORD;
bPhysAddr : TMACAddress; // Вот здесь и лежит МАС!!!
dwAddr : DWORD;
dwType : DWORD;
end;
TMibIPNetRowArray = array [0..512] of TMibIPNetRow;
PTMibIPNetTable = ^TMibIPNetTable;
TMibIPNetTable = packed record
dwNumEntries : DWORD;
Table: TMibIPNetRowArray;
end;
function GetIpNetTable; external IPHLPAPI name 'GetIpNetTable';
function TMainForm.GetMacFromIP(const IP: String): String;
function GetMAC(Value: TMacAddress; Length: DWORD): String;
var
I: Integer;
begin
if Length = 0 then Result := '00-00-00-00-00-00' else
begin
Result := '';
for i:= 0 to Length -2 do
Result := Result + IntToHex(Value[i], 2) + '-';
Result := Result + IntToHex(Value[Length-1], 2);
end;
end;
// Получаем IP адрес
function GetDottedIPFromInAddr(const InAddr: Integer): String;
begin
Result := '';
Result := IntToStr(FOURTH_IPADDRESS(InAddr));
Result := Result + '.' + IntToStr(THIRD_IPADDRESS(InAddr));
Result := Result + '.' + IntToStr(SECOND_IPADDRESS(InAddr));
Result := Result + '.' + IntToStr(FIRST_IPADDRESS(InAddr));
end;
// Основная функция
var
Table: TMibIPNetTable;
Size: Integer;
CatchIP: String;
Err, I: Integer;
begin
Result := RES_UNKNOWN;
Size := SizeOf(Table); // Ну тут все просто...
Err := GetIpNetTable(@Table, @Size, False); // Выполняем...
if Err <> NO_ERROR then // Проверка на ошибку...
begin
ShowMessage(SysErrorMessage(GetLastError));
Exit;
end;
// Теперь мы имеем таблицу из IP адресов и соответсвующих им MAC адресов
for I := 0 to Table.dwNumEntries - 1 do // Ищем нужный IP ...
begin
CatchIP := GetDottedIPFromInAddr(Table.Table[I].dwAddr);
if CatchIP = IP then // И выводим его МАС ...
begin
Result := GetMAC(Table.Table[I].bPhysAddr, Table.Table[I].dwPhysAddrLen);
Break;
end;
end;
end;