Delphi Tips(5) IPアドレスからMACアドレスを取得する
あちこちにSendARPをつかったMACアドレスを取得するサンプルがあったが、どれも動かない… 大ハマりです(涙
で!?? なんとか、動くようになったのでメモっておきます
原因は inet_addr関数の使い方で、string→AnsiString→PAnsiStringと型変換してやる必要があるみたい...
どうしてこんな型変換が必要かはわかりませんが、どうにか動きます。 疲れました、トホホです。
◆出力例
IPアドレス : 192.168.1.xx PC名 : syatyouxx MACアドレス: 00-0C-29-68-xx-xx
◆ソース (コンソールアプリを作成して、ソースを張り付けてみてください)
program Project1; {$APPTYPE CONSOLE} {$R *.res} uses Windows, SysUtils, Classes, Winsock, IdUDPClient, IdStack; function SendARP(DestIp: DWORD; srcIP: DWORD; pMacAddr: pointer; PhyAddrLen: pointer): DWORD; stdcall; external 'iphlpapi.dll'; function GetMACAdress_FromIPAddress(const IPAddress: string; var MACAddress: string): Boolean; var RC: DWORD; AnsiIPAddress: AnsiString; dwRemoteIP: DWORD; PhyAddrLen: Longword; pMacAddr: array [0 .. 1] of Longword; temp: array [0 .. 5] of Byte; i: Byte; begin Result := False; AnsiIPAddress := AnsiString(IPAddress); dwRemoteIP := inet_addr(PAnsiChar(AnsiIPAddress)); if dwRemoteIP <> 0 then begin PhyAddrLen := 6; RC := SendARP(dwRemoteIP, 0, @pMacAddr, @PhyAddrLen); if RC = NO_ERROR then begin if (PhyAddrLen <> 0) and (pMacAddr[0] <> 0) then begin Move(pMacAddr, temp, 6); MACAddress := ''; for i := 0 to PhyAddrLen - 1 do begin MACAddress := MACAddress + IntToHex(temp[i], 2) + '-'; end; Delete(MACAddress, Length(MACAddress), 1); Result := True; end; end; end; end; var MACAddress: string; IdUDP: TIdUDPClient; LocalAddress, LocalHostName: string; begin IdUDP := TIdUDPClient.Create(nil); LocalAddress := GStack.LocalAddress; LocalHostName := GStack.HostName; writeln('IPアドレス : '+LocalAddress); writeln('PC名 : '+LocalHostName); MACAddress := ''; if GetMACAdress_FromIPAddress(LocalAddress, MACAddress) then begin writeln('MACアドレス: '+MACAddress); end else begin writeln('MACアドレス: '+'IPアドレスからMACアドレスの変換に失敗しました。'); end; IdUDP.Free; readln; end.