19 Stimmen

Delphi, Wie kann man alle lokalen IPs erhalten?

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.

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.

15voto

Christopher Chase Punkte 2810

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;

8voto

gabr Punkte 26255

Wenn Sie ICS für die Socket-Kommunikation verwenden, können Sie die LocalIPList-Funktion verwenden, die in der OverbyteIcsWSocket-Einheit definiert ist.

Auch wenn Sie es nicht verwenden, können Sie den Quellcode herunterladen und die Implementierung nachschlagen. Es verwendet intern WinSock.

4voto

mjn Punkte 35903

Die Jedi Code-Bibliothek enthält ein Verfahren

Verfahren GetIpAddresses(Ergebnisse: TStrings); 

in der Einheit JclSysInfo

2voto

Remko Punkte 6724

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;

1voto

Kikone jacob Punkte 11

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.com

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.

Powered by:

X