Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Namen der Netzwerk-Verbindungen auslesen (https://www.delphipraxis.net/170122-namen-der-netzwerk-verbindungen-auslesen.html)

Christian Seehase 27. Okt 2012 18:17

AW: Namen der Netzwerk-Verbindungen auslesen
 
Hier haben wir auch noch ein paar Beispiele zu den Funktionen aus der DP

http://www.delphipraxis.net/9580-sub...-finden-2.html
http://www.delphipraxis.net/818-gate...-auslesen.html

Helmi 27. Okt 2012 18:31

AW: Namen der Netzwerk-Verbindungen auslesen
 
Danke Danke Danke für die vielen Tips!

Irgendwie hab ich immer falsch gesucht (oder wie auch immer)

Ich hab jetzt mal was zusammengebastelt:

Delphi-Quellcode:
const
  MAX_ADAPTER_DESCRIPTION_LENGTH = 128; // arb.
  MAX_ADAPTER_NAME_LENGTH        = 256; // arb.
  MAX_ADAPTER_ADDRESS_LENGTH     = 8; // arb.

type
  PIP_ADDRESS_STRING = ^IP_ADDRESS_STRING;
  IP_ADDRESS_STRING = packed record
    acString: array [1..16] of AnsiChar;
  end;

  PIP_MASK_STRING = ^IP_MASK_STRING;
  IP_MASK_STRING = IP_ADDRESS_STRING;

  PIP_ADDR_STRING = ^IP_ADDR_STRING;
  IP_ADDR_STRING = packed record
    Next    : PIP_ADDR_STRING;
    IpAddress: IP_ADDRESS_STRING;
    IpMask  : IP_MASK_STRING;
    Context : DWORD;
  end;

  time_t = int64;

  PIP_ADAPTER_INFO = ^IP_ADAPTER_INFO;
  IP_ADAPTER_INFO = packed record
    Next               : PIP_ADAPTER_INFO;
    ComboIndex         : DWORD;
    AdapterName        : array [1..MAX_ADAPTER_NAME_LENGTH + 4] of AnsiChar ;
    Description        : array [1..MAX_ADAPTER_DESCRIPTION_LENGTH + 4] of AnsiChar;
    AddressLength      : UINT;
    Address            : array [1..MAX_ADAPTER_ADDRESS_LENGTH] of Byte;
    Index              : DWORD;
    dwType             : UINT;
    DhcpEnabled        : UINT;
    CurrentIpAddress   : PIP_ADDR_STRING;
    IpAddressList      : IP_ADDR_STRING;
    GatewayList        : IP_ADDR_STRING;
    DhcpServer         : IP_ADDR_STRING;
    HaveWins           : Boolean;
    PrimaryWinsServer  : IP_ADDR_STRING;
    SecondaryWinsServer : IP_ADDR_STRING;
    LeaseObtained      : time_t;
    LeaseExpires       : time_t;
  end;

  function GetAdaptersInfo(const pAdapterInfo: PIP_ADAPTER_INFO; const pOutBufLen: PULONG): DWORD; stdcall;
    external 'IPHLPAPI.DLL' name 'GetAdaptersInfo';

//http://msdn.microsoft.com/en-us/library/windows/desktop/aa365917(v=vs.85).aspx
procedure GetConnectionNameList(List: TStrings);
var
  pAdapterList: PIP_ADAPTER_INFO;
  dwLenAdapter: DWORD;
  ErrorCode  : DWORD;

begin
  List.Clear;

  pAdapterList := nil; // Alles auf 0 ==> Benötigte Buffergrösse ermitteln
  dwLenAdapter := 0;

  ErrorCode := GetAdaptersInfo(pAdapterList, @dwLenAdapter);

  If ErrorCode <> ERROR_BUFFER_OVERFLOW then
    begin
      RaiseLastOSError(ErrorCode);

      exit;
    end;

  pAdapterList := AllocMem(dwLenAdapter);

  try
    ErrorCode := GetAdaptersInfo(pAdapterList, @dwLenAdapter);

    If ErrorCode <> ERROR_SUCCESS then
      begin
        RaiseLastOSError(ErrorCode);

        exit;
      end;


    while Assigned(pAdapterList) do
      begin
        List.Add(Format('AdapterName: %s', [String(pAdapterList.AdapterName)]));
        List.Add(Format('Descpription: %s', [String(pAdapterList.Description)]));
        List.Add(Format('ComboIndex: %d', [pAdapterList.ComboIndex]));
        List.Add(Format('AddressLength: %d', [pAdapterList.AddressLength]));
        List.Add(Format('Address: %d', [UInt64(pAdapterList.Address)]));
        List.Add(Format('Index: %d', [pAdapterList.Index]));
        List.Add(Format('dwType: %d', [pAdapterList.dwType]));
        List.Add(Format('DhcpEnabled: %d', [pAdapterList.DhcpEnabled]));
        List.Add(Format('IpAddressList.IpAddress: %s', [String(pAdapterList.IpAddressList.IpAddress.acString)]));
        List.Add(Format('IpAddressList.IpMask: %s', [String(pAdapterList.IpAddressList.IpMask.acString)]));
        List.Add(Format('IpAddressList.Context: %d', [pAdapterList.IpAddressList.Context]));
        List.Add(Format('GatewayList.IpAddress: %s', [String(pAdapterList.GatewayList.IpAddress.acString)]));
        List.Add(Format('GatewayList.IpMask: %s', [String(pAdapterList.GatewayList.IpMask.acString)]));
        List.Add(Format('GatewayList.Context: %d', [pAdapterList.GatewayList.Context]));
        List.Add(Format('DhcpServer.IpAddress: %s', [String(pAdapterList.DhcpServer.IpAddress.acString)]));
        List.Add(Format('DhcpServer.IpMask: %s', [String(pAdapterList.DhcpServer.IpMask.acString)]));
        List.Add(Format('DhcpServer.Context: %d', [pAdapterList.DhcpServer.Context]));
        List.Add(Format('IpAddressList.HaveWins: %d', [Integer(pAdapterList.HaveWins)]));
        List.Add(Format('PrimaryWinsServer.IpAddress: %s', [String(pAdapterList.PrimaryWinsServer.IpAddress.acString)]));
        List.Add(Format('PrimaryWinsServer.IpMask: %s', [String(pAdapterList.PrimaryWinsServer.IpMask.acString)]));
        List.Add(Format('PrimaryWinsServer.Context: %d', [pAdapterList.PrimaryWinsServer.Context]));
        List.Add(Format('SecondaryWinsServer.IpAddress: %s', [String(pAdapterList.SecondaryWinsServer.IpAddress.acString)]));
        List.Add(Format('SecondaryWinsServer.IpMask: %s', [String(pAdapterList.SecondaryWinsServer.IpMask.acString)]));
        List.Add(Format('SecondaryWinsServer.Context: %d', [pAdapterList.SecondaryWinsServer.Context]));

        List.Add('-------------------------------------------------------');

        pAdapterList := pAdapterList.Next;
      end;
   finally
     FreeMem(pAdapterList);
   end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  GetConnectionNameList(Memo1.Lines);
end;
Da les ich mir jetzt alles aus was GetAdaptersInfo zu bieten hat.
Nur, und jetzt bitte keine Schläge, in meinem ersten Post oben fragte ich nach dem Namen der Netzwerkverbindung - diese wird mir jetzt über GetAdaptersInfo nicht mehr angeboten. Kann man die über GetAdaptersInfo nicht auslesen? - muss ich dazu WMI benutzen?
Ich würd halt ungern zwei "verschiedene" Funktionen nutzen um eigentlich im gleichen Bereich (also Netzwerk) Daten auszulesen

[Edit]
In der Code-Libary findet man diesen Thread.
Damit könnt ich aus der Registry den Namen auslesen...

himitsu 27. Okt 2012 18:33

AW: Namen der Netzwerk-Verbindungen auslesen
 
Tipp:
Gibt es in XE schon diese Units?
Delphi-Quellcode:
uses
  Winapi.IpTypes, Winapi.IpHlpApi;
(bzw. IpTypes und IpHlpApi)

Und pssst, Dein FreeMem gibt nichts frei, da dort der Pointer nil ist (weil dieser ja seit dem GetMem verändert "Next" wurde).
(siehe mein Edit ... hatte das auch erst vergessen :oops:, aber keine Sorge ... der Code vom CodeOrakel, vergißt dagegen sogar komplett der Freigeben)

Da AdapterName ein ANSI-String ist, besser nach AnsiString und nicht String "casten" (
Delphi-Quellcode:
String(pAdapterList.AdapterName)
) ... dann gibt's eventuell auch weniger Compilerhinweise, bezüglich ANSI<>Unicode.

Und IpAddressList = evetuell auch mehrere IPs und nicht nur Eine.

Helmi 27. Okt 2012 18:35

AW: Namen der Netzwerk-Verbindungen auslesen
 
Zitat:

Zitat von himitsu (Beitrag 1188663)
Tipp:
Gibt es in XE schon diese Units?
Delphi-Quellcode:
uses
  Winapi.IpTypes, Winapi.IpHlpApi;
(bzw. IpTypes und IpHlpApi)

In meinem XE2 gibt es diese beiden Units

[Edit]
sehr praktische Units - spart viel Definitionsarbeit (vor allem wenn man es schon getan hat :-( )

Helmi 27. Okt 2012 18:52

AW: Namen der Netzwerk-Verbindungen auslesen
 
Zitat:

Zitat von himitsu (Beitrag 1188663)
Tipp:
Und pssst, Dein FreeMem gibt nichts frei, da dort der Pointer nil ist (weil dieser ja seit dem GetMem verändert "Next" wurde).
(siehe mein Edit ... hatte das auch erst vergessen :oops:, aber keine Sorge ... der Code vom CodeOrakel, vergißt dagegen sogar komplett der Freigeben)

stimmt - der ist nil!
Aber dann dürft ja FreeMem nichts zu tun haben und falls ja, dann wird Speicher freigegeben.
Ich seh jetzt nicht so das Problem das drinzulassen, oder?


Zitat:

Zitat von himitsu (Beitrag 1188663)
Da AdapterName ein ANSI-String ist, besser nach AnsiString und nicht String "casten" (
Delphi-Quellcode:
String(pAdapterList.AdapterName)
) ... dann gibt's eventuell auch weniger Compilerhinweise, bezüglich ANSI<>Unicode.

Also mein Delphi ist da ganz ruhig (ok - hab jetzt die o. g. Units mit drin)

Zitat:

Zitat von himitsu (Beitrag 1188663)
Und IpAddressList = evetuell auch mehrere IPs und nicht nur Eine.

Aber es wird doch nur eine angezeigt bzw. rückgemeldet von GetAdaptersInfo?


So - jetzt muss ich Himitsu genügend Zeit zum Antworten und Editieren geben.... - ist halt nimmer der Jüngste :mrgreen:

RWarnecke 27. Okt 2012 19:15

AW: Namen der Netzwerk-Verbindungen auslesen
 
Mit GetAdaptersInfo funktioniert es nur mit der Registry. Wenn Du nur System gleich oder größer Windows XP unterstützen möchtest, dann nimm MSDN-Library durchsuchenGetAdaptersAddresses.

himitsu 27. Okt 2012 19:30

AW: Namen der Netzwerk-Verbindungen auslesen
 
Wenn man FreeMem nil gibt, dann macht es nichts, da es ja denkt es gäbe nichts freizugeben.

Man muß ihm schon einen Pointer geben, welcher auch (noch) auf den freizugebenden Speicherblock zeigt.

Helmi 27. Okt 2012 20:02

AW: Namen der Netzwerk-Verbindungen auslesen
 
Zitat:

Zitat von RWarnecke (Beitrag 1188669)
Mit GetAdaptersInfo funktioniert es nur mit der Registry. Wenn Du nur System gleich oder größer Windows XP unterstützen möchtest, dann nimm MSDN-Library durchsuchenGetAdaptersAddresses.

Bin ich jetzt blind oder steht in GetAdaptersInfo keine IP-Adresse?
Den "FriendlyName" hab ich gefunden - genau das was ich suche

Ich sehe GetAdaptersAddresses als Ergänzung zu GetAdaptersInfo an

Schwedenbitter 10. Okt 2016 13:49

AW: Namen der Netzwerk-Verbindungen auslesen
 
Hat schon mal jemand diesen Code mit
Delphi-Quellcode:
ReportMemoryLeaksOnShutdown:= True;
compiliert/ausgeführt?


Ich frage bloß deshalb, weil ich damit einen belegten Speicherblock angezeigt bekomme. Ich habe hier (vorletzter Post) ähnlichen Code gefunden, in dem vor
Delphi-Quellcode:
pAdapterList := pAdapterList.Next;
der aktuelle Eintrag auf eine Temp-Variable übertragen und diese dann jedes Mal freigegeben wird. Damit bekomme ich kein Speicherleck mehr.

Ich liebe aber kurzen Code. Daher meine Frage. Sollte es also wirklich kürzer gehen, würde ich mich über eine Antwort freuen.

himitsu 10. Okt 2016 14:26

AW: Namen der Netzwerk-Verbindungen auslesen
 
Für die Schleife muß man eine eigene Variable verwenden, denn durch
Delphi-Quellcode:
pAdapterList:=pAdapterList.Next
wird ja der Zeiger verschoben, und
Delphi-Quellcode:
FreeMem(pAdapterList)
kann dann nicht mehr das freigeben, was durch
Delphi-Quellcode:
AllocMem
reserviert wurde.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:11 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz