在delphi的nb30.pas單元中,包含了對(duì)netbios協(xié)議的完全支持,在該單元中定義了一個(gè)名為netbios的函數(shù),通過該函數(shù)就能夠得到本機(jī)的MAC地址.
在編程時(shí),引入nb30單元.如下源碼....
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms,
Dialogs, nb30, StdCtrls; //加 nb30
type
TForm1 = class(TForm)
Edit1: TEdit;
procedure
FormCreate(Sender: TObject);
private
{ Private declarations
}
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function GetNetBIOSAddress : string;
var ncb :
TNCB;
status : TAdapterStatus;
lanenum : TLanaEnum;
procedure ResetAdapter (num : char);
begin
fillchar(ncb,sizeof(ncb),0);
ncb.ncb_command:=char(NCBRESET);
ncb.ncb_lana_num:=num;
Netbios(@ncb);
end;
var
i:integer;
lanNum : char;
address : record
part1 : Longint;
part2 :
Word;
end absolute status;
begin
Result:='';
fillchar(ncb,sizeof(ncb),0);
ncb.ncb_command:=char(NCBENUM);
ncb.ncb_buffer:=@lanenum;
ncb.ncb_length:=sizeof(lanenum);
Netbios(@ncb);
if lanenum.length=#0 then exit;
lanNum:=lanenum.lana[0];
ResetAdapter(lanNum);
fillchar(ncb,sizeof(ncb),0);
ncb.ncb_command:=char(NCBASTAT);
ncb.ncb_lana_num:=lanNum;
ncb.ncb_callname[0]:='*';
ncb.ncb_buffer:=@status;
ncb.ncb_length:=sizeof(status);
Netbios(@ncb);
ResetAdapter(lanNum);
for i:=0 to 5 do
begin
result:=result+inttoHex(integer(Status.adapter_address[i]),2);
if
(i<5) then
result:=result+'-';
end;
end;
//
procedure
TForm1.FormCreate(Sender: TObject);
//命令
begin
edit1.text:=GetNetBIOSAddress;
end;
end.
當(dāng)然,也還有其它方法實(shí)現(xiàn).如下例則是引入dll函數(shù)庫來實(shí)現(xiàn)
Function MacAddress: string;
var
Lib: Cardinal;
Func: function(GUID: PGUID): Longint; stdcall;
GUID1, GUID2:
TGUID;
begin
Result := ';
Lib := LoadLibrary('rpcrt4.dll');
if Lib <> 0 then
begin
if Win32Platform
<>VER_PLATFORM_WIN32_NT then
@Func := GetProcAddress(Lib,
'UuidCreate')
else @Func := GetProcAddress(Lib,
'UuidCreateSequential');
if Assigned(Func) then
begin
if (Func(@GUID1) = 0) and
(Func(@GUID2) = 0) and
(GUID1.D4[2] = GUID2.D4[2]) and
(GUID1.D4[3] =
GUID2.D4[3]) and
(GUID1.D4[4] = GUID2.D4[4]) and
(GUID1.D4[5] = GUID2.D4[5]) and
(GUID1.D4[6] = GUID2.D4[6]) and
(GUID1.D4[7] = GUID2.D4[7]) then
begin
Result :=
IntToHex(GUID1.D4[2], 2) + '-' +
IntToHex(GUID1.D4[3], 2) + '-' +
IntToHex(GUID1.D4[4], 2) + '-' +
IntToHex(GUID1.D4[5], 2) + '-' +
IntToHex(GUID1.D4[6], 2) + '-' +
IntToHex(GUID1.D4[7], 2);
end;
end;
FreeLibrary(Lib);
end;
end;