虽然此类问题一讨论过众多次,但小弟再用的时候还是遇到了困惑,请各位高手们指点迷经。
我用Netbios API取得网卡号。(如下面的程序,摘自论坛)
function NBGetAdapterAddress : 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[0] ;
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[0] ;
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 ;这段程序执行正确结果条件:(1):机器的网卡不能集成,只能pci插槽的。
(2):机器的网卡驱动不能禁用。
如果机器的网卡是集成的,那么执行上述代码 if Ord(cRC) <> 0 then exit ; 会退出。出现''不能为空的错误!请个位大侠帮忙解决。是否还有其他方法得到网卡号。如注册表 win98、win2000、winme、winXP等。
我用Netbios API取得网卡号。(如下面的程序,摘自论坛)
function NBGetAdapterAddress : 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[0] ;
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[0] ;
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 ;这段程序执行正确结果条件:(1):机器的网卡不能集成,只能pci插槽的。
(2):机器的网卡驱动不能禁用。
如果机器的网卡是集成的,那么执行上述代码 if Ord(cRC) <> 0 then exit ; 会退出。出现''不能为空的错误!请个位大侠帮忙解决。是否还有其他方法得到网卡号。如注册表 win98、win2000、winme、winXP等。
请发[email protected]
uses nb30;
function GetPhysicalAddress: string;
Var
NCB : TNCB;
ADAPTER : TADAPTERSTATUS;
LANAENUM : TLANAENUM;
intIdx : Integer;
re : Char;
buf : String;
begin
Try
// Reset adapter
ZeroMemory(@NCB, SizeOf(NCB));
NCB.ncb_command := Chr(NCBRESET);
NCB.ncb_lana_num := LANAENUM.lana[0];//important
re := NetBios(@NCB);
If Ord(re)<>0 Then
begin
Result := '';
exit;
end;
// Get adapter address
ZeroMemory(@NCB, SizeOf(NCB));
NCB.ncb_command := Chr(NCBASTAT);
NCB.ncb_lana_num := LANAENUM.lana[0];
StrPCopy(NCB.ncb_callname, '*');
NCB.ncb_buffer := @ADAPTER.adapter_address[0];
NCB.ncb_length := SizeOf(ADAPTER);
re := NetBios(@NCB);
If Ord(re)<>0 Then
exit;
buf := '';
For intIdx := 0 To 5 Do
buf := buf + InttoHex(Integer(ADAPTER.adapter_address[intIdx]),2)+'-';
Result := copy(buf,0,length(buf)-1);
finally
// freemem(@NCB,SizeOf(NCB));
end;
end;
thanks!
或
ipconfig/all命令
保存到文本文件里面就好了.
搞这么复杂做什么?当然还可以用这个控件很不错:
http://www.csdn.net/cnshare/soft/15/15890.shtm