如何使用Delphi获取网卡的Mac地址?
-
05-09-2019 - |
题
根据标题 - 有人可以帮我吗?
解决方案
从 Jedi API标题库项目 - 文件是iphlpapi.zip。解开文件,您需要iptypes.pas和iphlpapi.pas。然后,您可以使用类似的东西:
procedure TForm1.Button1Click(Sender: TObject);
var
NumInterfaces: Cardinal;
AdapterInfo: array of TIpAdapterInfo;
OutBufLen: ULONG;
i: integer;
begin
GetNumberOfInterfaces(NumInterfaces);
SetLength(AdapterInfo, NumInterfaces);
OutBufLen := NumInterfaces * SizeOf(TIpAdapterInfo);
GetAdaptersInfo(@AdapterInfo[0], OutBufLen);
Memo1.Lines.Clear;
for i := 0 to NumInterfaces - 1 do begin
Memo1.Lines.Add(Format('%.2x:%.2x:%.2x:%.2x:%.2x:%.2x',
[AdapterInfo[i].Address[0], AdapterInfo[i].Address[1],
AdapterInfo[i].Address[2], AdapterInfo[i].Address[3],
AdapterInfo[i].Address[4], AdapterInfo[i].Address[5]]));
end;
end;
(省略所有错误处理,您当然应该添加它。)
其他提示
这 getAdaptersAddresses功能 是自2001年以来使用Windows XP获得适配器信息的首选方法。
适配器的信息已返回 IP_ADAPTER_ADDRESSES结构 由 AdapterAddresses
范围。
这
GetAdaptersAddresses
功能可以检索信息 IPv4 和 IPv6 地址。建议调用
GetAdaptersAddresses
功能是预先分配15KB的工作缓冲区,该缓冲区指向AdapterAddresses
范围。在典型的计算机上,这大大减少了GetAdaptersAddresses
功能返回ERROR_BUFFER_OVERFLOW
, ,这需要打电话GetAdaptersAddresses
多次功能。
procedure TForm1.Button1Click(Sender: TObject);
const
AF_UNSPEC = 0;
GAA_FLAG_INCLUDE_ALL_INTERFACES = $100;
WORKING_BUFFER_SIZE = 15000;
MAX_TRIES = 3;
var
pAddresses,
pCurrAddresses: PIpAdapterAddresses;
dwRetVal,
outBufLen: Cardinal;
i: Integer;
macAddress: string;
begin
Memo1.Lines.Clear;
outBufLen := WORKING_BUFFER_SIZE;
pAddresses := nil;
i := 0;
repeat
if Assigned(pAddresses) then
FreeMem(pAddresses);
GetMem(pAddresses, outBufLen);
if not Assigned(pAddresses) then
raise Exception.Create('Memory allocation failed for IP_ADAPTER_ADDRESSES struct');
dwRetVal := GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_ALL_INTERFACES, nil, pAddresses, @outBufLen);
Inc(i);
until (dwRetVal <> ERROR_BUFFER_OVERFLOW) or (i = MAX_TRIES);
try
if NO_ERROR <> dwRetVal then begin
if ERROR_NO_DATA = dwRetVal then begin
MessageDlg('No addresses were found for the requested parameters', mtInformation, [mbOK], 0);
Exit;
end
else
raise Exception.Create(SysErrorMessage(dwRetVal));
end;
pCurrAddresses := pAddresses;
while Assigned(pCurrAddresses) do begin
if pCurrAddresses^.PhysicalAddressLength > 0 then begin
Memo1.Lines.Add(pCurrAddresses^.FriendlyName);
macAddress := '';
for i := 0 to pCurrAddresses^.PhysicalAddressLength - 1 do begin
if i > 0 then
macAddress := macAddress + ':';
macAddress := macAddress + Format('%.2X', [pCurrAddresses^.PhysicalAddress[i]]);
end;
Memo1.Lines.Add(macAddress);
Memo1.Lines.Add('');
end;
pCurrAddresses := pCurrAddresses^.Next;
end;
finally
if Assigned(pAddresses) then
FreeMem(pAddresses);
end;
end;
在不了解Delphi的几乎所有内容的情况下,运行%System32% ipconfig.exe /all和解析输出怎么样?
不隶属于 StackOverflow