procedure TMainWinForm.FormCreate(Sender: TObject);
var
  Reg:TRegistry;
  IpAddressStr:String;
  i:integer;
  WSData:TWSAData;
  Host:PHostEnt;
  Ip:string;
  Ipstr:string;
  CPName:PChar;
  CGName:String;
  Size:DWord;
  Msg:String;
  PMsg:array[0..255] of Char;
  len:Integer;
begin
  Reg:=TRegistry.Create;
  IpAddressStr:='';
  try
    Reg.RootKey:=HKEY_LOCAL_MACHINE;
    if Reg.OpenKey('\Software\JFGL',False) then
      IpAddressStr:=Reg.ReadString('IpAddress')
    else
      IpAddressStr:='129.1.3.16';
  finally
    Reg.CloseKey ;
    //Reg.Free;
  end;  try
    Reg.RootKey:=HKEY_LOCAL_MACHINE;
    if Reg.OpenKey('\System\CurrentControlSet\Services\VxD\VNETSUP',False) then
      CGName:=Reg.ReadString('Workgroup')
    else
      CGName:='';
  finally
    Reg.CloseKey ;
    Reg.Free;
  end;
  GroupName:=CGName;  if IpAddressStr='' then
    IpAddressStr:='129.1.3.16';  NMUDP1.RemoteHost:=IpAddressStr;  GetMem(CPName,255);
  Size:=255;
  GetComputerName(CPName,Size);
  ComputerName:=CPName;  if WSAstartup(2,WSData)<>0 then  //为程序使用WS2_32.DLL初始化
    halt;
  Host:=gethostbyname(CPName);
  if Host=nil then
    IpAddress:='127.0.0.1'
  else begin
    for i:=1 to 4 do
    begin
      Ip:=inttostr(Ord(Host.h_addr^[i-1]));
      Ipstr:=Ipstr+Ip;
      if i<4 then
        Ipstr:=Ipstr+'.'
      else
        IpAddress:=Ipstr;
    end;
  end;
  WSACleanUp;
  FreeMem(CPName);  MACAddress:=NBGetAdapterAddress(0);
  Msg:='IP:'+IpAddress+'-MAC:'+MACAddress+'-CN:'+ComputerName+'-GN:'+GroupName;
  StrpCopy(PMsg,Msg);
  len:=length(Msg);
  NMUDP1.SendBuffer(PMsg,len+1);
  
  TimerSend.Enabled :=True;
end;

解决方案 »

  1.   

    function LocalIP : string; 
    type 
    TaPInAddr = array [0..10] of PInAddr; 
    PaPInAddr = ^TaPInAddr; 
    var 
    phe : PHostEnt; 
    pptr : PaPInAddr; 
    Buffer : array [0..63] of char; 
    I : Integer; 
    GInitData : TWSADATA; 
     
    begin 
    WSAStartup($101, GInitData); 
    Result := ''; 
    GetHostName(Buffer, SizeOf(Buffer)); 
    phe :=GetHostByName(buffer); 
    if phe = nil then Exit; 
    pptr := PaPInAddr(Phe^.h_addr_list); 
    I := 0; 
    while pptr^[I] <> nil do begin 
    result:=StrPas(inet_ntoa(pptr^[I]^)); 
    Inc(I); 
    end; 
    WSACleanup; 
    end; 
    注意,需要use WinSock Unit. 
      

  2.   

    uses Winsock;procedure TForm1.FormCreate(Sender: TObject);
    var
      wVersionRequested : WORD;
      wsaData : TWSAData;
    begin
    {Start up WinSock}
      wVersionRequested := MAKEWORD(1, 1);
      WSAStartup(wVersionRequested, wsaData);
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      p : PHostEnt;
      s : array[0..128] of char;
      p2 : pchar;
    begin
    {取得机器名}
      GetHostName(@s, 128);
      p := GetHostByName(@s);
      Memo1.Lines.Add(p^.h_Name);
    {取得ip地址}
      p2 := iNet_ntoa(PInAddr(p^.h_addr_list^)^);
      Memo1.Lines.Add(p2);
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
    {Shut down WinSock}
      WSACleanup;