在Delphi中获取本地IP地址

5

投票关闭,作为 https://dev59.com/mXRB5IYBdhLWcg3wl4Oc 的重复问题。 - mghie
这显然不是一个重复的问题,因为它指定“不使用第三方组件”。链接的问题没有这样做,而且没有答案使用Delphi Winsock。这里接受的答案回答了这个具体的问题。 - Guy Gordon
1个回答

15

来源:http://www.scalabium.com/faq/dct0037.htm

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Winsock;

Function GetIPAddress():String;
type
  pu_long = ^u_long;
var
  varTWSAData : TWSAData;
  varPHostEnt : PHostEnt;
  varTInAddr : TInAddr;
  namebuf : Array[0..255] of char;
begin
  If WSAStartup($101,varTWSAData) <> 0 Then
  Result := 'No. IP Address'
  Else Begin
    gethostname(namebuf,sizeof(namebuf));
    varPHostEnt := gethostbyname(namebuf);
    varTInAddr.S_addr := u_long(pu_long(varPHostEnt^.h_addr_list^)^);
    Result := 'IP Address: '+inet_ntoa(varTInAddr);
  End;
  WSACleanup;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption := GetIPAddress;
end;

end.

5
将namebuf的类型更改为ansi字符数组后编译成功。谢谢! - Darius
1
你应该在最初的问题中指出你正在使用Delphi 2009版本。请记住,有时某些事情可能会因为Delphi版本不同而发生变化。 - Ken White
@Kishor:该函数本身只需要Winsock单元,在D7中是这样的。那些其他单元只是添加到表单单元的常见单元。 - Todd
1
肯,他确实表明他正在使用Delphi 2009。 - Rob Kennedy
我不得不将namebuf修改为ansichar,但当我关闭软件时它显示EAccessViolation。我正在使用Delphi 10.3。 - Wellington Telles Cunha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接