在98下如何正确的取到机器网卡的MAC地址(100分)

  • 主题发起人 主题发起人 njhuadong
  • 开始时间 开始时间
N

njhuadong

Unregistered / Unconfirmed
GUEST, unregistred user!
在win98中,在用CoCreateGUID取网卡的MAC地址时,有时取的是网卡的mac地址,而有时取的是拨号网路适配器的MAC地址,如何解决,困惑....
 
uses nb30;
Showmessage('您的第' + edit1.text + '个适配器的MAC地址为' + NBGetAdapterAddress(StrtoInt(Edit1.Text)));
//
function NBGetAdapterAddress(a: integer): string;
//
function TForm1.NBGetAdapterAddress(a: integer): string;
//a指定多个网卡适配器中的哪一个0,1,2...
var
NCB: TNCB; // Netbios control block file://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[intIdx]),2);
Result := strTemp;
finally
end;
end;

 
to wqhatnet:
WIN2000 中可以,但在WIN98中不行,还望高手解答!
 
to wqhatnet:
在98中没有规律的,而且根据你的方法取的都是一些莫名其妙的数据
 
这个资料你看看吧
可以采用三种方式:
1、98下,采用GUID;
2、2000,XP下,通过ARP或UDP
举个例子:
用ARP,FIPAddr=你的网卡捆绑的IP
...
implementation
function inet_addr(const cp: PChar): DWord; stdcall; external 'WS2_32.DLL' name 'inet_addr';
function SendARP(const DestIP: DWord;
const SrcIP: DWord;
const pMacAddr: Pointer;
const PhyAddrLen: PULONG): DWord; stdcall; external 'IPHLPAPI.dll' name 'SendARP';

{$R *.dfm}
function TForm1.GetMacByIP(FIPAddr: string): string;
...

function TForm1.GetMacByIP(FIPAddr: string): string;
var
dwResult: DWord;
ulIPAddr: DWord;
ulMacAddr: array[0..5] of Byte;
ulAddrLen: ULONG;
begin
ulIPAddr := INet_Addr(PChar(FIPAddr));

if ulIPAddr = INADDR_NONE then
exit;
ulAddrLen := 6;
dwResult := SendARP(ulIPAddr, 0, @ulMacAddr, @ulAddrLen);

if dwResult = 0 then
result := (IntToHex(ulMacAddr[0], 2) + ':' +
IntToHex(ulMacAddr[1], 2) + ':' +
IntToHex(ulMacAddr[2], 2) + ':' +
IntToHex(ulMacAddr[3], 2) + ':' +
IntToHex(ulMacAddr[4], 2) + ':' +
IntToHex(ulMacAddr[5], 2))
else
result := '';
end;
 
是在win98下的,各位老大,帮帮忙啦!!!
 
收藏,学习
 
我以前好像是这么做的,分析DOS的ARP数据流,然后模拟一个包sendto到目标机器上(查自己的就发给自己的IP),然后解析返回的数据包就可以获得相关信息。
 
to iie:
能谈谈具体怎么做吗,最好是源码!!!
 

Similar threads

D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部