关于取MAC地址函数中的参数LANA的问题!!!(100分)

  • 主题发起人 主题发起人 honestman
  • 开始时间 开始时间
H

honestman

Unregistered / Unconfirmed
GUEST, unregistred user!
我用如下函数取MAC地址,需要输入参数a:integer,也就是LAN 适配器 (LANA) 号。
我在几台机器上试过用0,都可以取出正确的MAC地址,但是是否任何机器都可以用0呢?
是否一定要装了NetBIOS协议的机子才可以用这种方法取MAC地址呢?
uses Nb30

Function NBGetAdapterAddress(a:integer) : String;
Implementation

{$R *.DFM}

Procedure TForm1.Button1Click(Sender : TObject);
Begin
label1.Caption:=NBGetAdapterAddress(StrtoInt(Edit1.Text));
End;

Function NBGetAdapterAddress(a:Integer) : String;
Var

NCB : TNCB; // Netbios control block //NetBios控制块
ADAPTER : TADAPTERSTATUS; // Netbios adapter status//取网卡状态
LANAENUM : TLANAENUM; // Netbios lana
intIdx : Integer; // Temporary work value//临时变量
cRC : Char; // Netbios return code//NetBios返回值
strTemp : String; // Temporary string//临时变量

Begin
// Initialize
Result := '';

Try
// Zero control blocl
ZeroMemory(@NCB, SizeOf(NCB));

// Issue enum command
NCB.ncb_command := Chr(NCBENUM);
cRC := NetBios(@NCB);

// Reissue enum command
NCB.ncb_buffer := @LANAENUM;
NCB.ncb_length := SizeOf(LANAENUM);
cRC := NetBios(@NCB);
If Ord(cRC)<>0 Then
exit;

// Reset adapter
ZeroMemory(@NCB, SizeOf(NCB));
NCB.ncb_command := Chr(NCBRESET);
NCB.ncb_lana_num := LANAENUM.lana[a];
cRC := NetBios(@NCB);
If Ord(cRC)<>0 Then
exit;

// Get adapter address
ZeroMemory(@NCB, SizeOf(NCB));
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);

// Convert it to string
strTemp := '';
For intIdx := 0 To 5 Do
strTemp := strTemp + InttoHex(Integer(ADAPTER.adapter_address[in
tIdx]),2);
Result := strTemp;
Finally
End;
End;


End.
 
LAN 适配器 (LANA) 号是NetBIOS协议产生的,当然要装该协议,
不过我建议用ARP协议去取MAC地址,采用TCP/IP协议更通用一些
 
有源代码吗???
 
源代码没有,不过有一篇讲ARP解析的编程文章(PDF),不知你需要否?
 
看看也好!!!
谢谢啦!!!
haipeng@cmmail.com
 
当然也有不通过netbois协议取mac地址的,应该是来自liguang的答案,
要use comobj,activex;
function GetNetBIOSAddress :string;
var
Tmp:TGUID;
tmpstr,newstr:string;
cnt:Integer;
begin
try
CoCreateGuid(Tmp);
tmpstr:=GUIDToString(Tmp);
tmpstr:=Copy(tmpstr,Length(tmpstr)-12,12);
for cnt:=1 to 5 do
newstr :=newstr+Copy(tmpstr,cnt*2 -1 ,2)+'-' ;
newstr :=newstr+Copy(tmpstr,11,2);
except
newstr:='';
end;
Result :=newstr;
end;
 
发过去了,查收,呵呵
 
to wys205:
  那不是RFC中的内容吗???太复杂了。

to g622:
  那东西应该在98、me、nt、2000下都跑得动吧???
 
2000下没试过的
 
to g622:
  我测试过了,在98和NT下都没有问题,只是在2000下,每点一次都可以得到一个MAC地
址,而且每次得到的地址都是不同的。而且没有一个是正确的。

unit mainUnit;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
comobj,activex, StdCtrls, ExtCtrls, Grids;

type
TmainForm = class(TForm)
SG_show: TStringGrid;
Panel2: TPanel;
Label1: TLabel;
E_uno: TEdit;
B_getinfo: TButton;
procedure FormCreate(Sender: TObject);
procedure B_getinfoClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
mainForm: TmainForm;
function GetNetBIOSAddress :string;

implementation

{$R *.DFM}

function GetNetBIOSAddress :string;
var
Tmp:TGUID;
tmpstr,newstr:string;
cnt:Integer;
begin
try
CoCreateGuid(Tmp);
tmpstr:=GUIDToString(Tmp);
tmpstr:=Copy(tmpstr,Length(tmpstr)-12,12);
for cnt:=1 to 5 do
newstr :=newstr+Copy(tmpstr,cnt*2 -1 ,2)+'-' ;
newstr :=newstr+Copy(tmpstr,11,2);
except
newstr:='';
end;
Result :=newstr;
end;

procedure TmainForm.FormCreate(Sender: TObject);
begin
//初始化
sg_show.Cells[0,0]:='原用户编号:';
sg_show.Cells[0,1]:='原MAC地址:';
sg_show.Cells[0,3]:='当前MAC地址:';
sg_show.Cells[0,4]:='当前操作系统信息:';
e_uno.Text :='';
end;

procedure TmainForm.B_getinfoClick(Sender: TObject);
begin
sg_show.Cells[1,3]:=GetNetBIOSAddress;
end;

end.
 
look here吧 取得系统中网卡MAC地址的三种方法
http://www.delphibbs.com/delphibbs/dispq.asp?lid=547525
 
to honghs:
  有现成的Delphi源代码吗???
 
没有啊,我知道有个家伙有,但那家伙不肯给,将就点,找个会c的家伙翻译吧
 
to honghs:
  你怎么知道他的是正确的呢???可能他有的就是g622提供的吧???
 
不是,不是大富翁上的家伙来的
 
接受答案了.
 
后退
顶部