Jemand weiß, wie man auf einfache Weise in Delphi eine Liste (zum Beispiel TString) der lokalen IP-Adresse erhält.
Ich habe mir die anderen verwandten Fragen angesehen und kann scheinbar nicht herausfinden, wie man sie in Delphi umwandeln kann.
Jemand weiß, wie man auf einfache Weise in Delphi eine Liste (zum Beispiel TString) der lokalen IP-Adresse erhält.
Ich habe mir die anderen verwandten Fragen angesehen und kann scheinbar nicht herausfinden, wie man sie in Delphi umwandeln kann.
In indy 9 gibt es eine Einheit IdStack mit der Klasse TIdStack
fStack := TIdStack.CreateStack;
try
edit.caption := fStack.LocalAddress; //die erste Adresse glaube ich
ComboBox1.Items.Assign(fStack.LocalAddresses); //alle Adressen
finally
freeandnil(fStack);
end;
läuft super :)
von Remy Lebeaus Kommentar
Das Gleiche gibt es in Indy 10, aber der Code ist ein wenig anders:
TIdStack.IncUsage;
try
GStack.AddLocalAddressesToList(ComboBox1.Items);
Edit.Caption := ComboBox1.Items[0];
finally
TIdStack.DecUsage;
end;
Es kann auch mit Hilfe von WinApi erledigt werden (die erforderlichen Header sind in der Jedi ApiLib enthalten). So mache ich es in meiner TSAdminEx Anwendung:
function EnumerateIpAddresses(var IPList: TStringList): Boolean;
var
IPAddrTable: PMIB_IPADDRTABLE;
Size: DWORD;
Res: DWORD;
Index: Integer;
Addr: IN_ADDR;
begin
Result := False;
IPList.Duplicates := dupIgnore;
Size := 0;
// Benötigte Größe abrufen
if GetIpAddrTable(nil, Size, False) <> ERROR_INSUFFICIENT_BUFFER then Exit;
// Speicher reservieren
GetMem(IPAddrTable, Size);
Res := GetIpAddrTable(IPAddrTable, Size, True);
if Res <> NO_ERROR then Exit;
for Index := 0 to IPAddrTable^.dwNumEntries-1 do
begin
// ADDR in String konvertieren und zu IPList hinzufügen
Addr.S_addr := IPAddrTable^.table[Index].dwAddr;
// Implizite Stringkonvertierungswarnung in D2009 vermeiden durch explizites Casten zu String
IPList.Add({$IFDEF UNICODE}String({$ENDIF UNICODE}inet_ntoa(Addr){$IFDEF UNICODE}){$ENDIF UNICODE});
end;
// Speicher freigeben
FreeMem(IPAddrTable);
Result := True;
end;
Von Delphi 7 Indy 9 Quelle finde ich etwas, das das Problem mit GStack
gelöst hat. Es ist ein wenig anders als der vorherige Beitrag.
function GetLocalIPAddress(List: TStringlist): Integer;
begin
if Assigned(GStack) then
List.Assign(TStringlist(GStack.LocalAddresses))
else
begin
GStack := GStackClass.Create;
List.Assing(TStringlist(GStack.LocalAddresses));
FreeAndNil(GStack);
end;
end;
Ich denke, das wird auch mit Indy 10 funktionieren.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
0 Stimmen
Es wäre hilfreich, wenn Sie bereits auf die funktionierenden Lösungen verlinken würden. Sie fragen nicht danach, wie Sie eine Liste von IP-Adressen erhalten können; Sie fragen, wie Sie anderen Code nach Delphi konvertieren können. Zeigen Sie also den originalen Code.
0 Stimmen
Es ist am besten knifflig ... hängt davon ab, auf welchen Betriebssystemen der Code arbeiten soll ... er ist wahrscheinlich anfällig für Pufferüberlauf/Absturz. Glücklicherweise haben spätere Betriebssysteme von Windows zumindest bessere APIs/Unterstützung dafür.