function IpToMac(ip: string): string; var destIp, macLen, r: Cardinal; macAddr: array[0..5] of Byte; ansiIp: AnsiString; begin ansiIp := ip; destIp := inet_addr(PAnsiChar(ansiIp)); macLen := Length(macAddr); r := SendARP(destIp, 0, @macAddr, macLen); if r = 0 then Result := Format('%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x', [macAddr[0], macAddr[1], macAddr[2], macAddr[3], macAddr[4], macAddr[5]]) else Result := 'ERROR'; end; 在XE下需要winsock2和IpHlpApi两个单元
// ====================================================================== //返回值是主机AServerName的MAC地址 //AServerName参数的格式为'\\ServerName' 或者 'ServerName' //参数ServerName为空时返回本机的MAC地址 //MAC地址以'XX-XX-XX-XX-XX-XX'的格式返回 // ====================================================================== function GetMacAddress(const AServerName: string): string; type TNetTransportEnum = function (pszServer: PWideChar; Level: DWORD; var pbBuffer: pointer; PrefMaxLen: LongInt; var EntriesRead: DWORD; var TotalEntries: DWORD; var ResumeHandle: DWORD): DWORD; stdcall; TTransportInfo = record quality_of_service: DWord; number_of_vcs: DWORD; transport_name: PWChar; transport_address: PWChar; wan_ish: boolean; end; TNetApiBufferFree = function(Buffer: pointer): DWORD; stdcall; PTransportInfo = ^TTransportInfo; var E,ResumeHandle, EntriesRead, TotalEntries: DWORD; FLibHandle: THandle; sMachineName, sMacAddr, Retvar: string; pBuffer: pointer; pInfo: PTransportInfo; FNetTransportEnum: TNetTransportEnum; FNetApiBufferFree: TNetApiBufferFree; pszServer: array[0..128] of WideChar; i,ii,iIdx: integer; begin sMachineName := Trim(AServerName); Retvar := '00-00-00-00-00-00'; //Add leading \\ if missing if (sMachineName <> '') and (length(sMachineName) >= 2) then begin if copy(sMachineName,1,2) <> '\\' then sMachineName := '\\' + sMachineName; end; //Setup and load from DLL pBuffer := nil; ResumeHandle := 0; FLibHandle := LoadLibrary('NETAPI32.DLL'); // Execute the external function if FLibHandle <> 0 then begin @FNetTransportEnum := GetProcAddress(FLibHandle,'NetWkstaTransportEnum'); @FNetApiBufferFree := GetProcAddress(FLibHandle,'NetApiBufferFree'); E := FNetTransportEnum(StringToWideChar(sMachineName,pszServer,129),0, pBuffer,-1,EntriesRead,TotalEntries,Resumehandle); if E = 0 then begin pInfo := pBuffer; // Enumerate all protocols - look for TCPIP for i := 1 to EntriesRead do begin if pos('TCPIP',UpperCase(pInfo^.transport_name)) <> 0 then begin // Got It - now format result 'xx-xx-xx-xx-xx-xx' iIdx := 1; sMacAddr := pInfo^.transport_address; for ii := 1 to 12 do begin Retvar[iIdx] := sMacAddr[ii]; inc(iIdx); if iIdx in [3,6,9,12,15] then inc(iIdx); end; end; inc(pInfo); end; if pBuffer <> nil then FNetApiBufferFree(pBuffer); end; try FreeLibrary(FLibHandle); except // 错误处理 end; end; result:=Retvar; end;
function IpToMac(ip: string): string;
var
destIp, macLen, r: Cardinal;
macAddr: array[0..5] of Byte;
ansiIp: AnsiString;
begin
ansiIp := ip;
destIp := inet_addr(PAnsiChar(ansiIp));
macLen := Length(macAddr);
r := SendARP(destIp, 0, @macAddr, macLen);
if r = 0 then
Result := Format('%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x',
[macAddr[0], macAddr[1], macAddr[2], macAddr[3], macAddr[4], macAddr[5]])
else
Result := 'ERROR';
end;
在XE下需要winsock2和IpHlpApi两个单元
//返回值是主机AServerName的MAC地址
//AServerName参数的格式为'\\ServerName' 或者 'ServerName'
//参数ServerName为空时返回本机的MAC地址
//MAC地址以'XX-XX-XX-XX-XX-XX'的格式返回
// ======================================================================
function GetMacAddress(const AServerName: string): string;
type
TNetTransportEnum = function (pszServer: PWideChar;
Level: DWORD;
var pbBuffer: pointer;
PrefMaxLen: LongInt;
var EntriesRead: DWORD;
var TotalEntries: DWORD;
var ResumeHandle: DWORD): DWORD; stdcall;
TTransportInfo = record
quality_of_service: DWord;
number_of_vcs: DWORD;
transport_name: PWChar;
transport_address: PWChar;
wan_ish: boolean;
end;
TNetApiBufferFree = function(Buffer: pointer): DWORD; stdcall;
PTransportInfo = ^TTransportInfo;
var
E,ResumeHandle,
EntriesRead,
TotalEntries: DWORD;
FLibHandle: THandle;
sMachineName,
sMacAddr,
Retvar: string;
pBuffer: pointer;
pInfo: PTransportInfo;
FNetTransportEnum: TNetTransportEnum;
FNetApiBufferFree: TNetApiBufferFree;
pszServer: array[0..128] of WideChar;
i,ii,iIdx: integer;
begin
sMachineName := Trim(AServerName);
Retvar := '00-00-00-00-00-00';
//Add leading \\ if missing
if (sMachineName <> '') and (length(sMachineName) >= 2) then begin
if copy(sMachineName,1,2) <> '\\' then
sMachineName := '\\' + sMachineName;
end;
//Setup and load from DLL
pBuffer := nil;
ResumeHandle := 0;
FLibHandle := LoadLibrary('NETAPI32.DLL');
// Execute the external function
if FLibHandle <> 0 then begin
@FNetTransportEnum := GetProcAddress(FLibHandle,'NetWkstaTransportEnum');
@FNetApiBufferFree := GetProcAddress(FLibHandle,'NetApiBufferFree');
E := FNetTransportEnum(StringToWideChar(sMachineName,pszServer,129),0,
pBuffer,-1,EntriesRead,TotalEntries,Resumehandle);
if E = 0 then begin
pInfo := pBuffer;
// Enumerate all protocols - look for TCPIP
for i := 1 to EntriesRead do begin
if pos('TCPIP',UpperCase(pInfo^.transport_name)) <> 0 then begin
// Got It - now format result 'xx-xx-xx-xx-xx-xx'
iIdx := 1;
sMacAddr := pInfo^.transport_address;
for ii := 1 to 12 do begin
Retvar[iIdx] := sMacAddr[ii];
inc(iIdx);
if iIdx in [3,6,9,12,15] then inc(iIdx);
end;
end;
inc(pInfo);
end;
if pBuffer <> nil then FNetApiBufferFree(pBuffer);
end;
try
FreeLibrary(FLibHandle);
except
// 错误处理
end;
end;
result:=Retvar;
end;