unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons,nb30;type
  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    Label1: TLabel;
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation
function   GetMACAdress:   string;
  var
      NCB:   PNCB;
      Adapter:   PAdapterStatus;      URetCode:   PChar;     
      RetCode:   char;     
      I:   integer;
      Lenum:   PlanaEnum;     
      _SystemID:   string;
      TMPSTR:   string;
  begin     
      Result         :=   '';     
      _SystemID   :=   '';     
      Getmem(NCB,   SizeOf(TNCB));     
      Fillchar(NCB^,   SizeOf(TNCB),   0);      Getmem(Lenum,   SizeOf(TLanaEnum));     
      Fillchar(Lenum^,   SizeOf(TLanaEnum),   0);     
    
      Getmem(Adapter,   SizeOf(TAdapterStatus));     
      Fillchar(Adapter^,   SizeOf(TAdapterStatus),   0);     
    
      Lenum.Length         :=   chr(0);
      NCB.ncb_command   :=   chr(NCBENUM);     
      NCB.ncb_buffer     :=   Pointer(Lenum);     
      NCB.ncb_length     :=   SizeOf(Lenum);     
      RetCode                   :=   Netbios(NCB);     
    
      i   :=   0;     
      repeat
          Fillchar(NCB^,   SizeOf(TNCB),   0);
          Ncb.ncb_command     :=   chr(NCBRESET);     
          Ncb.ncb_lana_num   :=   lenum.lana[I];     
          RetCode                     :=   Netbios(Ncb);     
    
          Fillchar(NCB^,   SizeOf(TNCB),   0);
          Ncb.ncb_command     :=   chr(NCBASTAT);
          Ncb.ncb_lana_num   :=   lenum.lana[I];
          //   Must   be   16
          Ncb.ncb_callname   :=   '*                               '; //就是这里报错啦!.
    
          Ncb.ncb_buffer   :=   Pointer(Adapter);     
    
          Ncb.ncb_length   :=   SizeOf(TAdapterStatus);
          RetCode                 :=   Netbios(Ncb);     
          //----   calc   _systemId   from   mac-address[2-5]   XOR   mac-address[1]...     
          if   (RetCode   =   chr(0))   or   (RetCode   =   chr(6))   then
          begin     
              _SystemId   :=   IntToHex(Ord(Adapter.adapter_address[0]),   2)   +   '-'   +     
                  IntToHex(Ord(Adapter.adapter_address[1]),   2)   +   '-'   +     
                  IntToHex(Ord(Adapter.adapter_address[2]),   2)   +   '-'   +
                  IntToHex(Ord(Adapter.adapter_address[3]),   2)   +   '-'   +     
                  IntToHex(Ord(Adapter.adapter_address[4]),   2)   +   '-'   +     
                  IntToHex(Ord(Adapter.adapter_address[5]),   2);     
          end;
          Inc(i);     
      until   (I   >=   Ord(Lenum.Length))   or   (_SystemID   <>   '00-00-00-00-00-00');     
      FreeMem(NCB);
      FreeMem(Adapter);     
      FreeMem(Lenum);     
      GetMacAdress   :=   _SystemID;     
  end;{$R *.dfm}procedure TForm1.BitBtn1Click(Sender: TObject);
begin
    label1.Caption   :=   GetMACAdress;end;end.

解决方案 »

  1.   

    引用单元 nb30function NBGetAdapterAddress(adapterNum: integer): String;
    //adapter00为指定的网卡适配器
    Var
      NCB:TNCB; // NetBios控制块
      ADAPTER : TADAPTERSTATUS; // 获取网卡状态
      LANAENUM : TLANAENUM; // Netbios lana
      intIdx : Integer; // 临时变量
      cRC : Char; // NetBios返回值
      strTemp : String; // 临时变量Begin
      Result := '';
      Try
        // 清空控制块
        ZeroMemory(@NCB, SizeOf(NCB));
        NCB.ncb_command:=Chr(NCBENUM);
        cRC := NetBios(@NCB);    // 重新设置enum命令
        NCB.ncb_buffer := @LANAENUM;
        NCB.ncb_length := SizeOf(LANAENUM);
        cRC := NetBios(@NCB);
        If Ord(cRC)<>0 Then
          exit;
        // 重新设定网卡
        ZeroMemory(@NCB, SizeOf(NCB));
        NCB.ncb_command := Chr(NCBRESET);
        NCB.ncb_lana_num := LANAENUM.lana[adapterNum];
        cRC := NetBios(@NCB);
        If Ord(cRC)<>0 Then
          exit;
        // 获取网卡地址
        ZeroMemory(@NCB, SizeOf(NCB));
        NCB.ncb_command := Chr(NCBASTAT);
        NCB.ncb_lana_num := LANAENUM.lana[adapterNum];
        StrPCopy(NCB.ncb_callname, '*');
        NCB.ncb_buffer := @ADAPTER;
        NCB.ncb_length := SizeOf(ADAPTER);
        cRC := NetBios(@NCB);
        // 将获得信息转换为字符串
        strTemp := '';
        For intIdx := 0 To 5 Do
          strTemp := strTemp + InttoHex(Integer(ADAPTER.adapter_address[intIdx]),2);
        Result := strTemp;
      Finally
      End;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
       edit1.Text := NBGetAdapterAddress(0);
    end;
      

  2.   

    直接写也可以procedure TForm1.Button1Click(Sender: TObject);
    Var
      NCB : TNCB;
      ADAPTER : TADAPTERSTATUS;
      LANAENUM : TLANAENUM;
      intIdx : Integer;
      Vresult : Char;
      buf : String;
    begin
      Try
        ZeroMemory(@NCB, SizeOf(NCB));
        NCB.ncb_command := Chr(NCBRESET);
        NCB.ncb_lana_num := LANAENUM.lana[0];
        Vresult := NetBios(@NCB);
        If Ord(Vresult)<>0 Then
          exit;
        //获取网卡适配器地址
        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);
        Vresult := NetBios(@NCB);
        If Ord(Vresult)<>0 Then
          exit;
        buf := '';
        For intIdx := 0 To 5 Do
          buf := buf + InttoHex(Integer(ADAPTER.adapter_address[intIdx]),2)+'-';
        edit1.Text := copy(buf,0,length(buf)-1);
      Finally
      End;
    end;