Delphi 获取 XP系统 mac地址
在Delphi中获取Mac地址,你可以使用Windows API或者第三方库。以下是几种常见的方法:
方法1:使用Windows API
在Delphi中,你可以使用GetAdaptersInfo
或GetAdaptersAddresses
函数来获取网络适配器的信息,包括MAC地址。
使用GetAdaptersInfo
-
首先,需要包含必要的头文件。
#include <iphlpapi.h> #pragma comment(lib, "iphlpapi.lib")
2、然后,编写代码来获取MAC地址。
usesWindows, IPHlpAPI;function GetMACAddress: string;
varpAdapterInfo: PIP_ADAPTER_INFO;dwSize: ULONG;Status: DWORD;pIPAddr: PIP_ADDR_STRING;
beginpAdapterInfo := nil;dwSize := 0;Status := GetAdaptersInfo(pAdapterInfo, dwSize);if Status = ERROR_BUFFER_OVERFLOW then beginGetMem(pAdapterInfo, dwSize);tryStatus := GetAdaptersInfo(pAdapterInfo, dwSize);if Status = NO_ERROR then beginwhile pAdapterInfo <> nil do beginResult := StringReplace(pAdapterInfo.Address, '-', ':', [rfReplaceAll]); // 转换为标准MAC地址格式Exit; // 找到第一个适配器就返回其MAC地址pAdapterInfo := pAdapterInfo.Next;end;end;finallyFreeMem(pAdapterInfo);end;end;
end;
使用GetAdaptersAddresses
GetAdaptersAddresses
是GetAdaptersInfo
的更现代和功能更丰富的替代品。
-
包含头文件。
#include <iphlpapi.h>
#pragma comment(lib, "iphlpapi.lib")
2、编写代码。
usesWindows, IPHlpAPI;function GetMACAddress: string;
varpAddresses: PIP_ADAPTER_ADDRESSES;dwSize: ULONG;dwRetVal: DWORD;
beginpAddresses := nil;dwSize := 0;dwRetVal := GetAdaptersAddresses(AF_UNSPEC, 0, nil, pAddresses, dwSize);if dwRetVal = ERROR_BUFFER_OVERFLOW then beginGetMem(pAddresses, dwSize);trydwRetVal := GetAdaptersAddresses(AF_UNSPEC, 0, nil, pAddresses, dwSize);if dwRetVal = ERROR_SUCCESS then beginwhile pAddresses <> nil do beginResult := StringReplace(pAddresses.PhysicalAddressString, '-', ':', [rfReplaceAll]); // 转换为标准MAC地址格式Exit; // 找到第一个适配器就返回其MAC地址pAddresses := pAddresses.Next;end;end;finallyFreeMem(pAddresses);end;end;
end;
方法2:
uses nb30;function NBGetAdapterAddress(a: Integer): string;
var
NCB: TNCB;
ADAPTER: TADAPTERSTATUS;
LANAENUM: TLANAENUM;
intIdx: Integer;
cRC: Char;
strTemp: string;
begin
Result := '';try
ZeroMemory(@NCB, SizeOf(NCB)); // Zero control bloclNCB.ncb_command := Chr(NCBENUM); // Issue enum command
cRC := NetBios(@NCB);NCB.ncb_buffer := @LANAENUM; // Reissue enum command
NCB.ncb_length := SizeOf(LANAENUM);
cRC := NetBios(@NCB);
if Ord(cRC) <> 0 then
exit;ZeroMemory(@NCB, SizeOf(NCB)); // Reset adapter
NCB.ncb_command := Chr(NCBRESET);
NCB.ncb_lana_num := LANAENUM.lana[a];
cRC := NetBios(@NCB);
if Ord(cRC) <> 0 then
exit;ZeroMemory(@NCB, SizeOf(NCB)); // Get adapter address
NCB.ncb_command := Chr(NCBASTAT);
NCB.ncb_lana_num := LANAENUM.lana[a];
StrPCopy(NCB.ncb_callname, '*');
NCB.ncb_buffer := @ADAPTER;
NCB.ncb_length := SizeOf(ADAPTER);
cRC := NetBios(@NCB);strTemp := ''; // Convert it to string
for intIdx := 0 to 5 do
strTemp := strTemp + InttoHex(Integer(ADAPTER.adapter_address[intIdx]), 2);
Result := strTemp;
finally
end;
end;