Ging doch flotter
Also, ich hab die IPHelperAPI aus den Jedis benutzt.
die Lokale
IP Adresse erhältst Du dort mit VVGetIpAddrTable:
Delphi-Quellcode:
//------------------------------------------------------------------------------
// Datum : 19.06.2006
// Author: Sebastian Gingter
procedure TMyService.getLocalIpAddresses(var addr: TStringList; var idx: TStringList);
var
size: ulong;
p: PMibIpAddrTable;
i: integer;
begin
VVGetIpAddrTable(p, size, true);
if p <> nil then
begin
try
with p^ do
begin
for i := 0 to dwNumEntries-1 do
with table[i] do
begin
addr.Add(Format('%s', [IpAddressToString(dwAddr)]));
idx.Add(Format('%d', [dwIndex]));
end;
end;
finally
freeMem(p);
end;
end;
end;
Das IpAddressToString ist was kurzes eigenes:
Delphi-Quellcode:
//------------------------------------------------------------------------------
// Datum : 19.06.2006
// Author: Sebastian Gingter
function TMyService.IpAddressToString(Addr: DWORD): string;
var
InAddr: TInAddr;
begin
InAddr.S_addr := Addr;
Result := inet_ntoa(InAddr);
end;
Und dann das setzen:
Delphi-Quellcode:
//------------------------------------------------------------------------------
// Datum : 19.06.2006
// Author: Sebastian Gingter
function TMyService.CheckAndObtainIPAdress: boolean;
var
l_addresses: TStringList;
l_indices: TStringList;
i: integer;
begin
// Handle on new IP Address
m_NTEContext := 0;
m_NTEInstance := 0;
m_IpSelfSet := false;
l_addresses := TStringList.Create;
l_indices := TSTringList.Create;
try
// First check local IP addresses for target address (store in result):
getLocalIpAddresses(l_addresses, l_indices);
i := l_addresses.IndexOf(IPAddress);
result := (i <> -1);
m_ipAlreadySet := result;
if not m_ipAlreadySet
then
begin
if true
{ isIpAvailable } then
begin
// Get interface to set:
i := l_addresses.IndexOf(m_referenceIP);
if (i <> -1)
then
begin
result := ObtainIPAddress( StrToInt(l_indices[i]) );
end;
end;
end;
finally
FreeAndNil(l_addresses);
FreeAndNil(l_indices);
end;
end;
Wichtig dabei ist, dass Du in der oben gezeigten Variante mindestens eine
IP Adresse kennst, die schon auf dem Interface sitzt (in m_referenceIP). Sonst wird es Dir zwangsläufig passieren, dass Du die
IP auf dem falschen Interface setzt und damit ggf. auf dem WLAN eine
IP setzt die eigentlich am Kabel anliegen sollte.
Naja.. ich denke das dürfte schonmal ein Stückchen helfen.