我从网上看到一篇可以取得远程机器的MAC信息源程序,我想把它改写成一个控件,但使用起来有一点问题,请高手改正。
以下为控件源代码:
unit net_info;interfaceuses
  Windows, Messages, SysUtils, Classes,winsock,Controls;
const
  WM_SOCK = WM_USER + 1;     //自定义windows消息
  UDPPORT = 6767;            //设定UDP端口号
  NBTPORT = 137;
type
  Tnet_info = class(TComponent)
    constructor create(Aowner:Tcomponent);
    constructor close;
    //procedure FormCreate(sender:Tobject);
    //procedure FormClose(Sender: TObject);
  private
    { Private declarations }
    s:TSocket;
    addr: TSockAddr;
    Freturn,FIP_begin:string;
    Fhandle:HWND;
    FSockAddrIn : TSockAddrIn; //利用消息实时获知UDP消息
  protected
    { Protected declarations }
  public
    { Public declarations }
    procedure start;
    procedure ReadData(var Message: TMessage);
    procedure SendData(b:array of byte);
    procedure GetInfo(buffer: Array of byte;len:integer);
    procedure WndProc(var Message: TMessage); message WM_SOCK;
  published
    { Published declarations }
    property return:string read Freturn write Freturn;
    property IP_begin:string read FIP_begin write FIP_begin;
  end;procedure Register;implementationconstructor Tnet_info.Create(Aowner:Tcomponent);
var
   TempWSAData: TWSAData;
begin
     // 初始化SOCKET
     inherited create(Aowner);
     FHandle := AllocateHWnd(WndProc);
     if WSAStartup($101, TempWSAData)=1 then
        Freturn:='StartUp Error!';     s:= Socket(AF_INET, SOCK_DGRAM, 0);
     if (s = INVALID_SOCKET) then   //Socket创建失败
     begin
          Freturn:=inttostr(WSAGetLastError())+'  Socket创建失败';
          CloseSocket(s);
     end;
     //本机SockAddr绑定
     addr.sin_family := AF_INET;
     addr.sin_addr.S_addr := INADDR_ANY;
     addr.sin_port := htons(UDPPORT);
     if Bind(s, addr, sizeof(addr)) <> 0  then
       begin
         Freturn:='bind fail';
       end;
     WSAAsyncSelect(s,FHandle , WM_SOCK, FD_READ);
     //对方SockAddrIn设定
     FSockAddrIn.SIn_Family := AF_INET;
     FSockAddrIn.SIn_Port := htons(NBTPORT);
end;constructor Tnet_info.close;
begin
    CloseSocket(s);
end;procedure Tnet_info.WndProc(var Message: TMessage);
begin
  case Message.Msg of
    WM_SOCK: ReadData(Message);
  end;
end;procedure Tnet_info.GetInfo(buffer: Array of byte;len:integer);
var
    str:string;
    i,j,pos,name_num: integer;
begin  name_num:=0;
  for i:=1 to len do
  begin
    if((buffer[i]=$21)and(buffer[i+1]=$00)and(buffer[i+2]=$01))
    then
    begin
      name_num:=buffer[i+9];
      break;
    end;
  end;
  if name_num=0 then exit;
  pos:=i+10;  str:='';
  for i:=pos to (pos+18*name_num-1) do
  begin
    if (((i-pos)mod 18) =0) then
    begin
      for j:=0 to 14 do
      begin
        if trim(char(buffer[i+j]))='' then buffer[i+j]:=ord(' ');
        str:=str+char(buffer[i+j]);
      end;
    if (buffer[i+16] and $80)=$80 then
    begin
      str:=str+format('<%x>',[buffer[i+15]]);
      Freturn:=str+'<GROUP>';
    end
    else
    begin
      str:=str+format('<%x>',[buffer[i+15]]);
      Freturn:=str+'<UNIQUE>';
    end;
    str:='';
    end;
  end;  for i:=0 to 5 do
  begin
    str:=str+format('%.2x.',[buffer[i+pos+18*name_num]]);
  end;
  delete(str,length(str),1);
  return:='MAC:'+str;
end;procedure Tnet_info.ReadData(var Message: TMessage);
var
   buffer: Array [1..500] of byte;
   len{,i}: integer;
   flen: integer;
   Event: word;
   value: string;begin
     value:='';
     flen:=sizeof(FSockAddrIn);
     FSockAddrIn.SIn_Port := htons(NBTPORT);
     Event := WSAGetSelectEvent(Message.LParam);
     if Event = FD_READ then
     begin
          len := recvfrom(s, buffer, sizeof(buffer), 0, FSockAddrIn, flen);
          if len<> 0 then GetInfo(buffer,len);
     end;
end;procedure Tnet_info.SendData(b:array of byte);
var
   len: integer;
begin     FSockAddrIn.SIn_Addr.S_addr := inet_addr(pchar(FIP_begin));
     len := sendto(s, b[0],50, 0, FSockAddrIn, sizeof(FSockAddrIn));
     if len = SOCKET_ERROR then
        return:='send fail';
     if len <> 50 then
        return:='Not Send all';
end;procedure Tnet_info.start;
const NbtstatPacket:array[0..49]of byte
      =($0,$0,$0,$10,$0,$1,
      $0,$0,$0,$0,$0,$0,$20,$43,$4b,
      $41,$41,$41,$41,$41,$41,$41,$41,
      $41,$41,$41,$41,$41,$41,$41,$41,
      $41,$41,$41,$41,$41,$41,$41,$41,
      $41,$41,$41,$41,$41,$41,$0,$0,$21,$0,$1);
begin  senddata(NbtstatPacket);
  
end;
procedure Register;
begin
  RegisterComponents('scxxf', [Tnet_info]);
end;end.