如何获取电脑中安装的所有网卡的MAC地址. ( 积分: 100 )

  • 主题发起人 主题发起人 seayhb
  • 开始时间 开始时间
S

seayhb

Unregistered / Unconfirmed
GUEST, unregistred user!
如题.
先谢了.
 
顶下,最好能获得网卡列表,网络上好象有用iphlpapi.dll动态库的,哪位大虾有Demo啊
 
{=================================================================
功 能: 取本机的MAC
=================================================================}
function GetMacAdd: string;
var
NCB: TNCB;
ADAPTER: TADAPTERSTATUS;
LANAENUM: TLANAENUM;
intIdx: Integer;
re: Char;
buf: string;
begin
try
ZeroMemory(@NCB, SizeOf(NCB));
NCB.ncb_command := Chr(NCBRESET);
NCB.ncb_lana_num := LANAENUM.lana[0];
re := NetBios(@NCB);
if Ord(re) <> 0 then
begin
result := '';
exit;
end;
ZeroMemory(@NCB, SizeOf(NCB));
NCB.ncb_command := Chr(NCBASTAT);
NCB.ncb_lana_num := LANAENUM.lana[0];
StrPCopy(NCB.ncb_callname, '*');
NCB.ncb_buffer := @ADAPTER.adapter_address[0];
NCB.ncb_length := SizeOf(ADAPTER);
re := NetBios(@NCB);
if Ord(re) <> 0 then
exit;

buf := '';
for intIdx := 0 to 5 do
buf := buf + InttoHex(Integer(ADAPTER.adapter_address[intIdx]), 2) + '-';
result := Copy(buf, 0, Length(buf) - 1);
finally
//
end;
end;

{=================================================================
功 能: 取远程的MAC,但要有可访问权限
=================================================================}
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;

TNetApiBufferFree = function(Buffer: pointer): DWORD; stdcall;

PTransportInfo = ^TTransportInfo;
TTransportInfo = record
quality_of_service: DWORD;
number_of_vcs: DWORD;
transport_name: PWChar;
transport_address: PWChar;
wan_ish: boolean;
end;

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;
 
to bbscom:
有获取网卡列表的方法吗?
 
后退
顶部