function LanCardID: string; //获取网卡物理地址 var guid: TGUID; i: integer; begin result := ''; CoCreateGUID(guid); for i := Low(guid.D4)+2 to High(guid.D4) do begin result := result + IntToHex(guid.D4[i],2); end; end;
unit MacAdress;interface uses SysUtils,NB30, Classes, Controls, StdCtrls,windows;function Getmac:string;implementationtype PASTAT = ^TASTAT; TASTAT = record adapter : TAdapterStatus; name_buf : TNameBuffer; end;function Getmac:string; var ncb : TNCB; s:string; adapt : TASTAT; lanaEnum : TLanaEnum; i, j, m : integer; strPart, strMac : string; begin result:=''; FillChar(ncb, SizeOf(TNCB), 0); ncb.ncb_command := Char(NCBEnum); ncb.ncb_buffer := PChar(@lanaEnum); ncb.ncb_length := SizeOf(TLanaEnum); s:=Netbios(@ncb); m:=1; if (Win32Platform = VER_PLATFORM_WIN32_WINDOWS) then m:=0; for i := 0 to integer(lanaEnum.length)-1 do begin FillChar(ncb, SizeOf(TNCB), 0); ncb.ncb_command := Char(NCBReset); ncb.ncb_lana_num := lanaEnum.lana[i]; Netbios(@ncb); Netbios(@ncb); FillChar(ncb, SizeOf(TNCB), 0); ncb.ncb_command := Chr(NCBAstat); ncb.ncb_lana_num := lanaEnum.lana[i]; ncb.ncb_callname := '* '; ncb.ncb_buffer := PChar(@adapt); ncb.ncb_length := SizeOf(TASTAT); if m=1 then begin if Netbios(@ncb) = Chr(0) then strMac := ''; for j := 0 to 5 do begin strPart := IntToHex(integer(adapt.adapter.adapter_address[j]), 2); strMac := strMac + strPart ; end; SetLength(strMac, Length(strMac)); end; if m=0 then if Netbios(@ncb) <> Chr(0) then begin strMac := ''; for j := 0 to 5 do begin strPart := IntToHex(integer(adapt.adapter.adapter_address[j]), 2); strMac := strMac + strPart ; end; SetLength(strMac, Length(strMac)); end; end; result:=trim(strmac); end;
1.使用GUID. 2.用一个老协议NetBios来获得MAC地址 3.使用RPC方式获得MAC地址.一.GUID是所有支持COM计数的WINDOWS系统中定义的一个数据结构.在GUID的生成过程中就参考了MAC地址并借肋MAC地址的全局唯一性来确定GUID的全局惟一性我们可利用这个特性获取本机mac 地址.在本机网卡mac 地址生成的guid中最后六个字节就是网卡的mac地址.
二........
三........如需实例来件: [email protected]
NBGetAdapterAddress里的a参数怎么传递啊?还有我想通过机器名称来得到网络上的任意一台机器的MAC,那改怎么办呢?
//获取网卡物理地址
var guid: TGUID;
i: integer;
begin
result := '';
CoCreateGUID(guid);
for i := Low(guid.D4)+2 to High(guid.D4) do
begin
result := result + IntToHex(guid.D4[i],2);
end;
end;
uses SysUtils,NB30, Classes, Controls, StdCtrls,windows;function Getmac:string;implementationtype
PASTAT = ^TASTAT;
TASTAT = record
adapter : TAdapterStatus;
name_buf : TNameBuffer;
end;function Getmac:string;
var
ncb : TNCB;
s:string;
adapt : TASTAT;
lanaEnum : TLanaEnum;
i, j, m : integer;
strPart, strMac : string;
begin
result:='';
FillChar(ncb, SizeOf(TNCB), 0);
ncb.ncb_command := Char(NCBEnum);
ncb.ncb_buffer := PChar(@lanaEnum);
ncb.ncb_length := SizeOf(TLanaEnum);
s:=Netbios(@ncb);
m:=1;
if (Win32Platform = VER_PLATFORM_WIN32_WINDOWS) then
m:=0;
for i := 0 to integer(lanaEnum.length)-1 do
begin
FillChar(ncb, SizeOf(TNCB), 0);
ncb.ncb_command := Char(NCBReset);
ncb.ncb_lana_num := lanaEnum.lana[i];
Netbios(@ncb);
Netbios(@ncb);
FillChar(ncb, SizeOf(TNCB), 0);
ncb.ncb_command := Chr(NCBAstat);
ncb.ncb_lana_num := lanaEnum.lana[i];
ncb.ncb_callname := '* ';
ncb.ncb_buffer := PChar(@adapt);
ncb.ncb_length := SizeOf(TASTAT); if m=1 then
begin
if Netbios(@ncb) = Chr(0) then
strMac := '';
for j := 0 to 5 do
begin
strPart := IntToHex(integer(adapt.adapter.adapter_address[j]), 2);
strMac := strMac + strPart ;
end;
SetLength(strMac, Length(strMac));
end;
if m=0 then
if Netbios(@ncb) <> Chr(0) then
begin
strMac := '';
for j := 0 to 5 do
begin
strPart := IntToHex(integer(adapt.adapter.adapter_address[j]), 2);
strMac := strMac + strPart ;
end;
SetLength(strMac, Length(strMac));
end;
end;
result:=trim(strmac);
end;