回复人: BCB(:)) 得25分 
#include "winsock.h"
void __fastcall TForm1::Button1Click(TObject *Sender)
{
WSAData wsaData;
WSAStartup(MAKEWORD(2,0),&wsaData); //初始化WINSOCK调用char HostName[64]; //存放本主机名
gethostname(HostName,sizeof(HostName)); //得到主机名
Edit1->Text=HostName;HOSTENT *lpHostEnt=gethostbyname(HostName); //利用主机名去取主机结构
for (int i=0; lpHostEnt->h_addr_list[i]!=NULL; i++)
{
IN_ADDR *p=(IN_ADDR *)(lpHostEnt->h_addr_list[i]);
String IP=inet_ntoa(*p); //数字地址转换成带.的IP串
Memo1->Lines->Add(IP);
}
WSACleanup(); //释放WINSOCK调用
} 回复贴子:  
回复人: BCB(:)) 得0分 
这是C++的,让你参考,
有的机子有多个IP地址,都能一一显示出;
 回复贴子:  
回复人: sun_lz(sun_xp) 得25分 
procedure TForm1.ButtonIPClick(Sender: TObject);
type
TaPInAddr = Array[0..10] of PInAddr;
PaPInAddr = ^TaPInAddr;
var
phe: PHostEnt;
pptr: PaPInAddr;
Buffer: Array[0..63] of Char;
I: Integer;
GInitData: TWSAData;
IP: String;
begin
Screen.Cursor := crHourGlass;
try
WSAStartup($101, GInitData);
IP:='0.0.0.0';
GetHostName(Buffer, SizeOf(Buffer));
phe := GetHostByName(buffer);
if phe = nil then
begin
ShowMessage(IP);
Exit;
end;
pPtr := PaPInAddr(phe^.h_addr_list);
I := 0;
while pPtr^[I] <> nil do
begin
IP := inet_ntoa(pptr^[I]^);
Inc(I);
end;
WSACleanup;
ShowMessage(IP);
finally
Screen.Cursor := crDefault;
end;
end;
 

解决方案 »

  1.   

    用TNMHTTP控件可以取。
    NMHTTP1.LocalIP;
      

  2.   

    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;
    ========================================
    program get_ip;
    uses
      winsock,sysutils;
    VAR
      ch : ARRAY[1..32] OF Char;
      i : Integer;
      WSData: TWSAData;
      MyHost: PHostEnt;
    begin
      IF WSAstartup(2,wsdata)<>0 THEN
        BEGIN
          Writeln('can''t start Winsock: Error ',WSAGetLastError);
          Halt(2);
        END;
      try
        IF getHostName(@ch[1],32)<>0 THEN
          BEGIN
            Writeln('getHostName failed');
            Halt(3);
          END;
      except
        Writeln('getHostName failed');
        halt(3);
      end;
      MyHost:=GetHostByName(@ch[1]);
      IF MyHost=NIL THEN
        BEGIN
          Writeln(GetHostName('+StrPas(@ch[1])+') failed : Error
    '+IntToStr(WSAGetLastError));
          Halt(4);
        END
      ELSE
        BEGIN
            Write('address ');
             FOR i:=1 TO 4 DO
                BEGIN
                  Write(Ord(MyHost.h_addr^[i-1]));
                  IF i<4 THEN
    then     write('.')
                  ELSE
                    writeln;
                END;
       END;
    end.
    ===========================================
      

  3.   

    tpowersock有localip属性!
    动态创建一个TPowerSock,然后读取它的LocalIP属性
      

  4.   

    简单点
    function TfmMain.GetLocalIP: string;
    var
      wVersionRequested: WORD;
      wsaData: TWSAData;
      p: PHostEnt;
      s: array[0..128] of Char;
    begin
      wVersionRequested := MAKEWORD(1, 1);
      WSAStartup(wVersionRequested, wsaData);
      try
        GetHostName(@s, 128);
        p := GetHostByName(@s);
       {Get the IpAddress}
        Result := StrPas(iNet_ntoa(PInAddr(p^.h_addr_list^)^));
      finally
        WSACleanup
      end
    end;不要忘了Uses  WinSock;