虽然此类问题一讨论过众多次,但小弟再用的时候还是遇到了困惑,请各位高手们指点迷经。
我用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等。 

解决方案 »

  1.   

    那用发UDP数据包的办法,给自己发一个数据包,分析包里的MAC地址。
      

  2.   

    在delphi超级猛料里有,如果楼住需要
    请发[email protected]
      

  3.   

    如何获得网卡编号
    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;
      

  4.   

    chenquan(嘉威王子) 
    thanks!
      

  5.   

    你可以用IPHLPAPI.dll中的函数SENDARP获取其他网卡的地址,包括你自己的,只要你知道IP
      

  6.   

    to:多谢chenquan大侠出手相助,不过我试了试,还是不行。希望各位大侠在多提一些见解!
      

  7.   

    chenquan(嘉威王子) 的代码不是跟楼主的相差无几
      

  8.   

    nbtstat命令

    ipconfig/all命令
    保存到文本文件里面就好了.
    搞这么复杂做什么?当然还可以用这个控件很不错:
    http://www.csdn.net/cnshare/soft/15/15890.shtm