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.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です