Delphi - объектно-ориентированный язык программирования, разработанный компанией Borland в 1995 году. Он основан на языке программирования Pascal, но имеет более расширенные возможности и добавлены новые функции.
Delphi является интегрированной средой разработки (IDE), которая позволяет разрабатывать программное обеспечение для различных платформ, включая Windows, macOS, Android и iOS. Delphi достигает многоплатформенности с помощью...
functionmy_ip_address: longint; const
bufsize = 255; var
buf: pointer; RemoteHost: PHostEnt; (* Не освобождайте это! *) begin
buf := nil
; try
getmem(buf, bufsize); winsock.gethostname(buf, bufsize);
(* это может работать и без сети *) RemoteHost := Winsock.GetHostByName(buf); ifRemoteHost = nil
then
my_ip_address := winsock.htonl($07000001)
(* 127.0.0.1 *) elsemy_ip_address := longint(pointer(RemoteHost^.h_addr_list^)^); finally
if
buf <> nil
then
freemem(buf, bufsize); end
; result := winsock.ntohl(result); end
;
Вначале возвращается локальный сетевой адрес компьютера, а затем, если он не равен 127.0.0.1, стандартный IP адрес.
Единственное, что вам необходимо, это наличие winsock.dcu/winsock.pas, так как это не включается в поставку Delphi 1.; необходимый мне код я взял из tcpip component pack (просто вырезал его оттуда).
Дополнение от Eugene:
Данный пример не работает из-за того что не проинициализирована структура TWSAData. если немного подправить эту функцию, то получится примерно следующее:
functionmy_ip_address: longint; const
bufsize = 255; WSVer = $101; var
buf: pointer; RemoteHost: PHostEnt; // Не освобождайте это! wsaData: TWSAData; begin
if
WSAStartup(WSVer, wsaData) <> 0 then
begin
my_ip_address := 0; exit; end
; buf := nil
; try
getmem(buf, bufsize); winsock.gethostname(buf, bufsize); // это может работать и без сети RemoteHost := Winsock.GetHostByName(buf); if
RemoteHost = nil
then
my_ip_address := winsock.htonl($07000001) // 127.0.0.1 else
my_ip_address := longint(pointer(RemoteHost^.h_addr_list^)^); finally
if
buf <> nil
then
freemem(buf, bufsize); end
; result := winsock.ntohl(result); end
;
Функция вернет ненулевое значение в случае успеха.
Тестировано под WinXP SP1, D6