Die Funktion GetIpAddress von Daniel beachtet nicht, dass GetHostByName mehrere
IP Adressen zurückliefern kann. Das Ergebnis leifert nur die erste
IP Adresse in der Liste.
Versuchs mal damit:
-GetIPs liefert dir ne Liste mit allen
IP Adressen des PCs
-GetInetIP versucht die Adresse der Verbindung, die das point-to-point Protokol verwendet (dieses Protokol wird von den meisten Provider verwendet) zu holen. Falls das nicht klappt (also keine PPP Verbindung da ist) wird die erste(*)
IP von GetIPs zurückgeliefert. Somit hat man schon mit einer hohen Wahrscheinlichkeit die richtige
IP.
(*)Du könntest die Funktion noch erweitern:
GetInetIP könnte noch alle lokalen
IP Adressen, die GetIPs liefert, rausfiltern.
Und falls das alle IPs entfernen würde, dann könntest du noch die
www.whatsmyip.com Version noch einbauen.
Delphi-Quellcode:
function GetIPs: TStrings;
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 := TstringList.Create;
Result.Clear;
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.Add(inet_ntoa(pptr^[I]^));
Inc(I);
end;
WSACleanup;
end;
function GetInetIP: string;
var
IpHlpModule: THandle;
GetAdaptersInfo: function (pAdapterInfo: PTIP_ADAPTER_INFO; pOutBufLen: PULONG): DWORD; stdcall;
pAdapterInfo, old: PTIP_ADAPTER_INFO;
len: integer;
begin
try
result:=GetIPs[0];
except
result:='0.0.0.0';
end;
IpHlpModule:=LoadLibrary(IpHlpDLL);
try
if IpHlpModule=0 then
begin
exit;
end;
GetAdaptersInfo:=GetProcAddress(IpHlpModule, 'GetAdaptersInfo');
getmem(pAdapterInfo, sizeof(TIP_ADAPTER_INFO));
old:=pAdapterInfo;
try
len:=sizeof(TIP_ADAPTER_INFO);
GetAdaptersInfo(pAdapterInfo, @len);
result:=pAdapterInfo^.IPAddressList.IpAddress;
while pAdapterInfo<>nil do
begin
if pAdapterInfo^.aType=IF_PPP_ADAPTERTYPE then
result:=pAdapterInfo^.IPAddressList.IpAddress;
pAdapterInfo:=pAdapterInfo.Next;
end;
finally
freemem(old);
end;
finally
if IpHlpModule<>0 then
begin
FreeLibrary(IpHlpModule);
end;
end;
end;