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; good luck三少 :o)

解决方案 »

  1.   

    #include <windows.h>
    #include <wincon.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>typedef struct _ASTAT_
    {
        ADAPTER_STATUS adapt;
        NAME_BUFFER    NameBuff [30];
    }ASTAT, * PASTAT;ASTAT Adapter;void main (void)
    {
        NCB ncb;
        UCHAR uRetCode;
        char NetName[50];    memset( &ncb, 0, sizeof(ncb) );
        ncb.ncb_command = NCBRESET;
        ncb.ncb_lana_num = 0;    uRetCode = Netbios( &ncb );
        printf( "The NCBRESET return code is: 0x%x \n", uRetCode );    memset( &ncb, 0, sizeof(ncb) );
        ncb.ncb_command = NCBASTAT;
        ncb.ncb_lana_num = 0;    strcpy( ncb.ncb_callname,  "*               " );
        ncb.ncb_buffer = (char *) &Adapter;
        ncb.ncb_length = sizeof(Adapter);    uRetCode = Netbios( &ncb );
        printf( "The NCBASTAT return code is: 0x%x \n", uRetCode );
        if ( uRetCode == 0 )
        {
            printf( "The Ethernet Number is: %02x%02x%02x%02x%02x%02x\n",
                    Adapter.adapt.adapter_address[0],
                    Adapter.adapt.adapter_address[1],
                    Adapter.adapt.adapter_address[2],
                    Adapter.adapt.adapter_address[3],
                    Adapter.adapt.adapter_address[4],
                    Adapter.adapt.adapter_address[5] );
        }
    }
     
    MSDN中的程序。
      

  2.   

    要uses哪些unit,无法编译
    undeclared indentifier 'TNCB' 'TADAPTERSTATUS'
    等等另外 变量a是什么意思?
    网卡mac地址的位数?
      

  3.   

    uses nb30;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[intIdx]),2)+'.';
        Result := strTemp;
      Finally
      End;
    End;
      

  4.   

    我的邮箱 [email protected]
    我这里上csdn很慢,谢谢各位大虾了
    我现在是利用别人用vc做的dll
    在delphi中调用
    不方便
      

  5.   

    结果不对
    程序结果是 D4.17.19.01.44.0B
    实际mac地址是 00-10-5A-61-99-F0为什么会这样?
      

  6.   

    不好意思
    是我用错了谢谢了  kingron
    我会用心研究的
      

  7.   


    procedure Tform1.nbgetmac;
      function hexbl(by:byte):string;
        begin
          result:=format('%x',[by]);
          if length(result)<2 then
            result:='0'+result;
        end;
    var
      ncb:Tncb;
      i,j:integer;
      adapter:TAdapterstatus;
      lanaenum:TLanaEnum;
      strx:string;
    begin
      zeromemory(@ncb,sizeof(ncb));
      ncb.ncb_command:=chr(ncbenum);
      netbios(@ncb);
      ncb.ncb_buffer:=@lanaenum;
      ncb.ncb_length:=sizeof(lanaenum);
      ncb.ncb_command :=chr(ncbenum);
      netbios(@ncb);
      for i:=0 to ord(lanaenum.length)-1 do
        begin
          zeromemory(@ncb,sizeof(ncb));
          ncb.ncb_command:=chr(ncbreset);
          ncb.ncb_lana_num:=lanaenum.lana[i];
          netbios(@ncb);
          zeromemory(@ncb,sizeof(ncb));
          ncb.ncb_command:=chr(ncbastat);
          ncb.ncb_lana_num:=lanaenum.lana[i];
          strcopy(ncb.ncb_callname,'*');
          ncb.ncb_buffer :=@adapter;
          ncb.ncb_length :=sizeof(adapter);
          netbios(@ncb);
          for j:=0 to 5 do
            begin
              if j>0 then strx:=strx+'-';
              strx:=strx+hexbl(byte(adapter.adapter_address[j]));
            end;
          showmessage(strx);
       end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      nbgetmac;
    end;