1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
| unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons;
type
TForm1 = class(TForm)
MemoMAC: TMemo;
Edit1: TEdit;
SpeedButton1: TSpeedButton;
ListBox1: TListBox;
procedure SpeedButton1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
function GetMACAdresses(const Adresses:TStrings;const MachineName:string=''):integer;
function GetMACAdress(const MachineName:string=''):string;
var
Form1: TForm1;
implementation
{$R *.DFM}
uses
NB30;
type
ENetBIOSError=class(Exception);
function NetBiosCheck(const b:char):char;
begin
if b<>chr(NRC_GOODRET) then raise ENetBIOSError.create('NetBios error'#13#10'Error code '+inttostr(ord(b)));
result:=b;
end;
function AdapterToString(const Adapter:PAdapterStatus):string;
begin
with Adapter^ do Result
:=Format('%2.2x-%2.2x-%2.2x-%2.2x-%2.2x-%2.2x',[Integer(adapter_address[0]),
Integer(adapter_address[1]),Integer(adapter_address[2]),
Integer(adapter_address[3]),Integer(adapter_address[4]),
Integer(adapter_address[5])]);
end;
procedure MachineNameToAdapter(Name:string;var AdapterName:array of char);
begin
if Name='' then Name:='*' else Name:=ansiuppercase(Name);
Name:=Name+StringOfChar(' ',length(AdapterName)-Length(Name));
move(Name[1],AdapterName[0],length(AdapterName));
end;
function GetMACAdresses(const Adresses:TStrings;const MachineName:string=''):integer;
var
i:integer;
NCB: PNCB;
Adapter:PAdapterStatus;
Lenum:PLanaEnum;
RetCode:char;
begin
Adresses.clear;
New(NCB);
New(Adapter);
New(Lenum);
try
Fillchar(NCB^,SizeOf(TNCB),0);
fillchar(Lenum^,SizeOf(TLanaEnum),0);
NCB.ncb_command:=chr(NCBENUM);
NCB.ncb_buffer:=Pointer(Lenum);
NCB.ncb_length:=SizeOf(Lenum^);
NetBiosCheck(Netbios(NCB));
result:=ord(Lenum.Length);
for i:=0 to result-1 do
begin
Fillchar(NCB^,SizeOf(TNCB),0);
Ncb.ncb_command:=chr(NCBRESET);
Ncb.ncb_lana_num:=lenum.lana[i];
NetBiosCheck(Netbios(Ncb));
FillChar(NCB^,SizeOf(TNCB),0);
FillChar(Adapter^,SizeOf(TAdapterStatus),0);
Ncb.ncb_command:=chr(NCBASTAT);
Ncb.ncb_lana_num:=lenum.lana[i];
MachineNameToAdapter(MachineName,Ncb.ncb_callname);
Ncb.ncb_buffer:=Pointer(Adapter);
Ncb.ncb_length:=SizeOf(TAdapterStatus);
RetCode:=Netbios(NCB);
if RetCode in [chr(NRC_GOODRET),chr(NRC_INCOMP)] then
Adresses.add(AdapterToString(Adapter));
end;
finally
Dispose(NCB);
Dispose(Adapter);
Dispose(Lenum);
end;
end;
function GetMACAdress(const MachineName:string=''):string;
var stringlist:tstringlist;
begin
stringlist:=tstringlist.create;
try
if GetMACAdresses(stringlist,MachineName)=0 then result:='' else
result:=stringlist[0];
finally
Stringlist.Free();
end;
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
MemoMAC.Clear();
GetMACAdresses(MemoMAC.Lines,Edit1.Text);
end;
end. |
Partager