用delphi如何像vc中的函數sendarp()一樣,輸入ip就可以返回mac地址呢.謝謝!

解决方案 »

  1.   

    unit Unit1;interface uses 
       Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
       StdCtrls, nb30;type
      TForm1 = class(TForm)
      Edit1: TEdit;
      Button1: TButton;
      Label1: TLabel;
      procedure Button1Click(Sender: TObject);
      function NBGetAdapterAddress(a: integer): string;
      private
    { Private declarations }   public
    { Public declarations } 
      end;var 
    Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); 
    begin 
    Showmessage('您的第' + 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;end.
      

  2.   

    大俠,如果我的電腦用網線連上的產品為網管或者路由器之類的,是否可以ping到之後,像sendarp()一樣可以獲得產品的mac呢,謝謝!
      

  3.   

    procedure NBGetMac(strings:Tstrings);
     function HexBL(by:Byte):string;
     begin
     result:=format('%x',[by]);
     if length(result)<2 then
      result:='0'+result;
     end;
    var 
     NCB:TNCB;
    Adapter:TAdapterStatus;
    LanaEnum:TLanaEnum;
    I,J:Integer;
    Str:String;
    begin
     strings.clear;
     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(NCBSTART);
      NCB.ncb_Lana_num:=LanaEnum.lana[i];
      strPcopy(NCB.ncb_callname,'*');
      NCB.ncb_buffer:=@Adapter;
      NCB.ncb_length:=sizeof(Adapter);
      netbios(@NCB);
      str:='';
      for j:=0 to 5 do
        begin
         if j>0 then str:=str+'-';
          str:str+HexBL(byte(adapter.adapter_address[j]));
         end;
        strings.add(str);
      end;
    end;