Як отримати ip адреса комп'ютера

(Для Dialup) Пожалуйстаб шматок коду. Дуже потрібно! Пробував компонентиб але це призвело до того, що моя програма Вісла приблизно кожні 3 хв. - (

var
# 032; WSAData. TWSAData;
# 032; p. PHostEnt;
# 032; Name. array [0 .. $ FF] of Char;

WSAStartup ($ 0101, WSAData);
# 032; # 032; GetHostName (name, $ FF);
# 032; # 032; p: = GetHostByName (Name);
# 032; # 032; ShowMessage ( "Your IP is.", Inet_ntoa (PInAddr (p.h_addr_list ^) ^));
# 032; # 032; WSACleanup;


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
# 032; # 032; # 032; begin
# 032; # 032; # 032; result: = StrPas (inet_ntoa (pptr ^ [I] ^));
# 032; # 032; # 032; Inc (I);
# 032; # 032; # 032; end;
WSACleanup;
end;

Дякую звичайно.
Але ні те ні інше не працює - що в uses на до писати?
А перший приклад я взагалі не зрозумів - це функція або що? Чому Var є, begin "а з end" ом - нету?

Причому в Faq чомусь теж щось подібне пишуть.
Я думав це запитання проста.

Ну ладноб може якийсь профі відповість.
Всім заздалегідь спасибочки!

Так. Не очікував. А так зійде?
Код заганяється в будь-яку процедуру або функцію:


var
WSAData. TWSAData;
p. PHostEnt;
Name. array [0 .. $ FF] of Char;
begin
WSAStartup ($ 0101, WSAData);
# 032; GetHostName (name, $ FF);
# 032; p: = GetHostByName (Name);
# 032; ShowMessage ( "Your IP is.", Inet_ntoa (PInAddr (p.h_addr_list ^) ^));
# 032; WSACleanup;
end;

Ну, очевидно ж, що в uses треба додати Winsock :)))))) Ну ти даєш. ))))) На Новий Рік перепив чи що.
Порився б по форуму, там подібних питань безліч.
Обидва приклади у мене відмінно працюють, і не мені приводити тобі код готового модуля.

Я спробував другий приклад, запрацювало, але прога все-одно висне. На скільки я розумію в цьому винен в основному мій провайдер, але як мені це обійти. Адже я думав, програмі не треба посилати запит до провайдера, типу: "Скажіть, будь ласка, а який у мене IP?" Це і на компі має як то зберігатися.

А може там кудись Application.ProcessMessages впіндюріть?

А на рахунок uses, вибач, не знав. Я з інтернет-додатками в перший раз зв'язався, ось і виходить така дрімучість.

А новий приклад зараз випробують.

Новий приклад:
Вставляю в процедуру. отримую:
[Error] manageru.pas (176): Too many actual parameters


Убірaю ShowMessage. на.
form1.currentip: = ipinet_ntoa (PInAddr (p.h_addr_list ^) ^);

отримую:
[Error] manageru.pas (165): Undeclared identifier: "ipinet_ntoa"

Winsock в uses варто.
Що я роблю не так?
(Delphi5)

З'явилася така ідея:

треба зробити другий exe, який буде займатися тільки відстеженням IP. І при зміні IP буде посилати моїй програмі якесь повідомлення, що містить новий IP. тоді зависати
буде не головна програма, а лише IP-Отслежіватель і користувач цього ніяк не помітить.

Але ось тільки як реалізувати це саме повідомлення.
Якщо хто знає, допоможіть. Дуже прошу!

Нещодавно чоловік теж шукав по ВП. У пошуку знайшлося все необхідне.


uses
Windows, SysUtils;
Const
RAS_MaxIpAddress = 15;
RAS_MaxDeviceType = 16;
RAS_MaxEntryName = 256;
RAS_MaxDeviceName = 128;

type
TRASPPPIP = record
dwSize. DWORD;
dwError. DWORD;
szIpAddress. array [0..RAS_MaxIpAddress] of char;
end;

THRASCONN = THandle;
TRASCONN = packed record
dwSize. DWORD;
hRasConn. THRASCONN;
szEntryName. array [0..RAS_MaxEntryName] of char;

szDeviceType. array [0..RAS_MaxDeviceType] of char;
szDeviceName. array [0..RAS_MaxDeviceName] of char;

szPadding. array [0..0] of Char;
end;

function RasGetIPAddress: string;
var
RASConns. TRasConn;
dwSize. DWORD;
dwCount. DWORD;
RASpppIP. TRASPPPIP;
begin
Result: = "";
RASConns.dwSize: = SizeOf (TRASConn);
RASpppIP.dwSize: = SizeOf (RASpppIP);
dwSize: = SizeOf (RASConns);
if RASEnumConnectionsA (@RASConns, @dwSize, @dwCount) = 0 then begin
if dwCount> 0 then begin
dwSize: = SizeOf (RASpppIP);
RASpppIP.dwSize: = SizeOf (RASpppIP);
if RASGetProjectionInfoA (RASConns.hRasConn,
RASP_PppIp,
@RasPPPIP,
@dwSize) = 0 then
Result: = StrPas (RASpppIP.szIPAddress);
end;
end;
end;

to Red_Alert:
Дякуємо! Увечері сьогодні спробую - про результати напишу.
А все-таки, може хто знає про exe-шники?

Ще раз спасибі всім!

Ось мені хто-небудь пояснити може, чому майже всі надіслані мені приклади не працюють? Може у мене Дельфі не така якась (варто Delphi5)?

У вас то вони працюють?
Або я щось не розумію?

Що я не так роблю щось?
Плиз, Хелп!

to Red_Alert:
[Error] Unit2.pas (43): Undeclared identifier: "RASEnumConnectionsA"

Ну вже не знаю, що і сказати-то тебе.Первий приклад у мене точно працює і вже давольно давно. Причому він вставден в прогу яка крім цього багато че робить і жодного зависання отримано не було. ось, що тобі порадити.

Z (07.01.02 22:57)
Судячи з діагностики, це ти не те робиш, у тебе не вказано модуль, в якому прописаний "RASEnumConnectionsA", а може і взагалі відсутній.