在WIN2K中读网卡地址的问题

piaoyes 2002-07-08 09:16:28
为什么在WIN98中读取网卡地址(MAC)只有一个,XP中也正常,
但是一到WIN2K中却可以读出几个网卡地址来,如何才能只读出真正的那个来?

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.
...全文
100 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
PingPingPangPang 2002-08-30
  • 打赏
  • 举报
回复
因为你的机器上系统模拟了其他的网卡。
ball_cao 2002-08-30
  • 打赏
  • 举报
回复
win98 和 win2k 取出的网卡地址不同是怎么回事?我是同一机器同一段代码取得的结果不同

深切关注
lancescott 2002-08-29
  • 打赏
  • 举报
回复
关注
piaoyes 2002-08-26
  • 打赏
  • 举报
回复
是MAC地址,不是IP地址
墨梅无痕 2002-08-25
  • 打赏
  • 举报
回复
如果你愿意使用控件,则可以使用Delphi 6的 Indy MISC 页上的带IP字样的
TIdIPWatch控件,通过它的CurrentIP属性可以不写一行代码就知道网卡当前
的IP地址。
oracle_lover 2002-08-10
  • 打赏
  • 举报
回复
type
PMACAddress = ^TMACAddress;
TMACAddress = array[0..5] of Byte; //六位网卡地址

function GetMACAddress(LanaNum: Byte; MACAddress: PMACAddress): Byte;

var
AdapterStatus: PAdapterStatus;
StatNCB: PNCB;

begin
New(StatNCB);
ZeroMemory(StatNCB, SizeOf(TNCB));
StatNCB.ncb_length := SizeOf(TAdapterStatus) + 255 * SizeOf(TNameBuffer);
GetMem(AdapterStatus, StatNCB.ncb_length);
try
with StatNCB^ do
begin
ZeroMemory(MACAddress, SizeOf(TMACAddress));
ncb_buffer := PChar(AdapterStatus);
ncb_callname := '* ' + #0;
ncb_lana_num := Char(LanaNum);
ncb_command := Char(NCBASTAT);
NetBios(StatNCB);
Result := Byte(ncb_cmd_cplt);
if Result = NRC_GOODRET then
MoveMemory(MACAddress, AdapterStatus, SizeOf(TMACAddress));
end;
finally
FreeMem(AdapterStatus);
Dispose(StatNCB);
end;
end;

function GetLanaEnum(LanaEnum: PLanaEnum): Byte;
var
LanaEnumNCB: PNCB;

begin
New(LanaEnumNCB);
ZeroMemory(LanaEnumNCB, SizeOf(TNCB));
try
with LanaEnumNCB^ do
begin
ncb_buffer := PChar(LanaEnum);
ncb_length := SizeOf(TLanaEnum);
ncb_command := Char(NCBENUM);
NetBios(LanaEnumNCB);
Result := Byte(ncb_cmd_cplt);
end;
finally
Dispose(LanaEnumNCB);
end;
end;

//在程序中显示网卡地址
New(MACAddress);
try
RetCode := GetMACAddress(0, MACAddress);
if RetCode = NRC_GOODRET then
begin
label5.caption := '你的网卡地址是:'+Format('%2.2x-%2.2x-%2.2x-%2.2x-%2.2x-%2.2x',
[MACAddress[0], MACAddress[1], MACAddress[2],
MACAddress[3], MACAddress[4], MACAddress[5]]);
end;
finally
Dispose(MACAddress);
end;
piaoyes 2002-08-07
  • 打赏
  • 举报
回复
是不是WIN2000的BUG?
没有高手了?

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧