//加入nb3.pas单元
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls,nb30;type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Label1: TLabel;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    Function NBGetAdapterAddress(a:integer):String;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
begin
memo1.lines.add('您的第'+edit1.text+'个适配器的MAC地址为'+NBGetAdapterAddress(StrtoInt(Edit1.Text)));
end;
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;procedure TForm1.FormCreate(Sender: TObject);
begin
memo1.lines.Clear;
end;end.

解决方案 »

  1.   

    用netbios编的。这个程序都编好久了!哈哈!
    unit MainMAC;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, NB30;type
      TGetMACForm = class(TForm)
        Edit1: TEdit;
        MACAddrButton: TButton;
        Label2: TLabel;
        Label1: TLabel;
        procedure MACAddrButtonClick(Sender: TObject);
       // procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      GetMACForm: TGetMACForm;implementation{$R *.DFM}type
     TNBLanaResources = (lrAlloc, lrFree);type
     PMACAddress = ^TMACAddress;
     TMACAddress = array[0..5] of Byte;
    function GetMACAddress(LanaNum: Byte; MACAddress: PMACAddress): Byte;
    var
      AdapterStatus: PAdapterStatus;
      StatNCB: PNCB;
    begin
      New(StatNCB);
      ZeroMemory(StatNCB, SizeOf(TNCB));
      StatNCB.ncb_length := SizeOf(TAdapterStatus) +  255 * SizeOf(TNameBuffer);
      GetMem(AdapterStatus, StatNCB.ncb_length);
      try
        with StatNCB^ do
        begin
          ZeroMemory(MACAddress, SizeOf(TMACAddress));
          ncb_buffer := PChar(AdapterStatus);
          ncb_callname := '*              ' + #0;
          ncb_lana_num := Char(LanaNum);
          ncb_command  := Char(NCBASTAT);
          NetBios(StatNCB);
          Result := Byte(ncb_cmd_cplt);
          if Result = NRC_GOODRET then
            MoveMemory(MACAddress, AdapterStatus, SizeOf(TMACAddress));
        end;
      finally
        FreeMem(AdapterStatus);
        Dispose(StatNCB);
      end;
    end;procedure TGetMACForm.MACAddrButtonClick(Sender: TObject);
    var
      LanaNum: Byte;
      MACAddress: PMACAddress;
      RetCode: Byte;
    begin
      LanaNum := 0;
      New(MACAddress);
      try
        RetCode := GetMACAddress(LanaNum, MACAddress);
        if RetCode = NRC_GOODRET then
        begin
          Edit1.Text := Format('%2.2x-%2.2x-%2.2x-%2.2x-%2.2x-%2.2x',
            [MACAddress[0], MACAddress[1], MACAddress[2],
             MACAddress[3], MACAddress[4], MACAddress[5]]);
        end else
        begin
          Beep;
          Edit1.Text := 'Error';
          ShowMessage('GetMACAddress Error! RetCode = $' + IntToHex(RetCode, 2));
        end;
      finally
        Dispose(MACAddress);
      end;
    end;end.