AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

IP-ADAPTER_ADDRESS Structure

Offene Frage von "CodeX"
Ein Thema von quendolineDD · begonnen am 16. Nov 2008 · letzter Beitrag vom 21. Mär 2009
Antwort Antwort
Seite 1 von 2  1 2      
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#1

IP-ADAPTER_ADDRESS Structure

  Alt 16. Nov 2008, 15:48
Hallo DP Comunity

Ich bin gerade dabei, mir mal die MSDN-Library durchsuchenIP_ADAPTER_ADDRESS Structure von C nach Delphi zu übersetzen und nebenbei viel mir auf, das ich alle anderen Structures, welche in den Headern sind und in C einfach nur inkludiert werden können auch noch übersetzt werden müssen ...

Jetzt stieß ich auf folgendes:
Code:
BYTE Dhcpv6ClientDuid[MAX_DHCPV6_DUID_LENGTH];
Nun hab ich gegoogelt und im Forum gesucht nach MAX_DHCPV6_DUID_LENGTH, kam jedoch zu keinem Ergebnis.
Weiß jemand von euch, welchen Wert MAX_DHCPV6_DUID_LENGTH hat?

In dem Thread http://www.delphipraxis.net/internal...apteraddresses wird schon auf fehlende Übersetzungen der anderen Structures hingewiesen, jedoch sind diese nirgendwo zu finden.

Bisweilen mache ich die noch selbst, eine fertige Übersetzung zu finden (außerhalb der JEDI-Komponenten) wäre natürlich genial.

Danke im Vorraus
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: IP-ADAPTER_ADDRESS Structure

  Alt 16. Nov 2008, 16:05
Ich bin mir ziemlich sicher, dass die Übersetzung bei den Jedis schon dabei ist. Also ich würde mir nicht die Mühe machen und so komplexe Dinge noch mal zu übersetzen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#3

Re: IP-ADAPTER_ADDRESS Structure

  Alt 16. Nov 2008, 16:13
Ich habe es auch selber übersetzt und habe dabei selber viel gelernt. Für mein Systeminfo habe ich den Teil nicht mit übersetzt, weil ich es nicht brauchte. Ich habe in dem verlinkten Beitrag nur noch den Teil übersetzt, der von Basilikum angegeben wurde, da ich keine Angaben zu DHCPv6 brauchte.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: IP-ADAPTER_ADDRESS Structure

  Alt 16. Nov 2008, 16:16
Ja, seh gerade dass die JwaIpHlpApi existiert ... Okay, das wird mir sicherlich alles mögliche an Zeitersparnis bringen
Sicher, "leider" will ich auch für die kommenden Ipv6 gerüstet sein
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: IP-ADAPTER_ADDRESS Structure

  Alt 16. Nov 2008, 19:21
Moin Lars,

falls Du doch noch weiter übersetzen willst:
MAX_DHCPV6_DUID_LENGTH ist in der IPTypes.h deklariert, und hat den Wert 130.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: IP-ADAPTER_ADDRESS Structure

  Alt 16. Nov 2008, 21:06
Dank dir

Ich selber kann kein C, sondern weiß nur die Zuordnung der Angaben aus der MSDN und deren Bedeutung in Delphi ...

Ich hab mir das bei Jedi mal angeschaut, jedoch wird dann die Unit riesiengroß, weil noch gleich 4 weitere Units benötigt werden, was entgegen meinem Ziel stand. Von daher würde ich mal weiter machen die einzelnen Structures zu übersetzen ...

MfG
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: IP-ADAPTER_ADDRESS Structure

  Alt 16. Nov 2008, 22:10
Alles klar. Habs nun soweit alles was zur GetAdaptersAddresses Function dazugehört.

Delphi-Quellcode:
unit uWinGetAdaptersAddresses;

interface

uses Windows;

const
  MAX_ADAPTER_ADDRESS_LENGTH = 8;
  MAX_DHCPV6_DUID_LENGTH = 130;

//ifType Const
  IF_TYPE_OTHER = 1;
  IF_TYPE_ETHERNET_CSMACD = 6;
  IF_TYPE_ISO88025_TOKENRING = 9;
  IF_TYPE_PPP = 23;
  IF_TYPE_SOFTWARE_LOOPBACK = 24;
  IF_TYPE_ATM = 37;
  IF_TYPE_IEEE80211 = 71;
  IF_TYPE_TUNNEL = 131;
  IF_TYPE_IEEE1394 = 144;

//OperStatus Const
  IfOperStatusUp = 1;
  IfOperStatusDown = 2;
  IfOperStatusTesting = 3;
  IfOperStatusUnknown = 4;
  IfOperStatusDormant = 5;
  IfOperStatusNotPresent = 6;
  IfOperStatusLowerLayerDown = 7;

//ConnectionType Const
  NET_IF_CONNECTION_DEDICATED = 1;
  NET_IF_CONNECTION_PASSIVE = 2;
  NET_IF_CONNECTION_DEMAND = 3;
  NET_IF_CONNECTION_MAXIMUM = 4;
type


//http://msdn.microsoft.com/en-us/library/ms740496(VS.85).aspx

PSOCKADDR = ^SOCKADDR;
SOCKADDR = record
  sa_family : ShortInt;
  sa_data : array[0..13] of Char;
end;


//http://msdn.microsoft.com/en-us/library/ms740507(VS.85).aspx

PSOCKET_ADDRESS = ^SOCKET_ADDRESS;
SOCKET_ADDRESS = record
  lpSocketaddr : PSOCKADDR;
  iSockaddrLength : Integer;
end;

//http://msdn.microsoft.com/en-us/library/aa366281(VS.85).aspx

IP_PREFIX_ORIGIN = (
  IpPrefixOriginOther = 0,
  IpPrefixOriginManual,
  IpPrefixOriginWellKnown,
  IpPrefixOriginDhcp,
  IpPrefixOriginRouterAdvertisement,
  IpPrefixOriginUnchanged = 16
);


//http://msdn.microsoft.com/en-us/library/aa366283(VS.85).aspx

IP_SUFFIX_ORIGIN = (
  IpSuffixOriginOther = 0,
  IpSuffixOriginManual,
  IpSuffixOriginWellKnown,
  IpSuffixOriginDhcp,
  IpSuffixOriginLinkLayerAddress,
  IpSuffixOriginRandom,
  IpSuffixOriginUnchanged = 16
);


//http://msdn.microsoft.com/en-us/library/aa366069(VS.85).aspx

IP_DAD_STATE = (
  IpDadStateInvalid = 0,
  IpDadStateTentative,
  IpDadStateDuplicate,
  IpDadStateDeprecated,
  IpDadStatePreferred
);

//http://msdn.microsoft.com/en-us/library/aa366066(VS.85).aspx

PIP_ADAPTER_UNICAST_ADDRESS = ^IP_ADAPTER_UNICAST_ADDRESS;
IP_ADAPTER_UNICAST_ADDRESS = record
  union: record
    case Integer of
    0: (Length: LongInt; Flags: DWORD);
    end;
  Next : PIP_ADAPTER_UNICAST_ADDRESS;
  Address : SOCKET_ADDRESS;
  PrefixOrigin : IP_PREFIX_ORIGIN;
  SuffixOrigin : IP_SUFFIX_ORIGIN;
  DadState : IP_DAD_STATE;
  ValidLifeTime : LongInt;
  PreferredLifeTime : LongInt;
  LeaseLifeTime : LongInt;
  OnLinkPrefixLength : array[0..7] of Integer;
end;


//http://msdn.microsoft.com/en-us/library/aa366059(VS.85).aspx

PIP_ADAPTER_ANYCAST_ADDRESS = ^IP_ADAPTER_ANYCAST_ADDRESS;
IP_ADAPTER_ANYCAST_ADDRESS = record
  union: record
    case Integer of
      0: (Alignment: LongInt);
      1: (Length: LongInt; Flags: DWORD);
    end;
  Next : PIP_ADAPTER_ANYCAST_ADDRESS;
  Address : SOCKET_ADDRESS;
end;


//http://msdn.microsoft.com/en-us/library/aa366063(VS.85).aspx

PIP_ADAPTER_MULTICAST_ADDRESS = ^IP_ADAPTER_MULTICAST_ADDRESS;
IP_ADAPTER_MULTICAST_ADDRESS = record
  union: record
    case Integer of
      0: (Alignment: LongInt);
      1: (Length: LongInt; Flags: DWORD);
    end;
  Next : PIP_ADAPTER_MULTICAST_ADDRESS;
  Address : SOCKET_ADDRESS;
end;


//http://msdn.microsoft.com/en-us/library/aa366060(VS.85).aspx

PIP_ADAPTER_DNS_SERVER_ADDRESS = ^IP_ADAPTER_DNS_SERVER_ADDRESS;
IP_ADAPTER_DNS_SERVER_ADDRESS = record
  union: record
    case Integer of
      0: (Alignment: LongInt);
      1: (Length: LongInt; Reserved: DWORD);
    end;
    Next : PIP_ADAPTER_DNS_SERVER_ADDRESS;
    Address : SOCKET_ADDRESS;
end;


//http://msdn.microsoft.com/en-us/library/aa366065(VS.85).aspx

PIP_ADAPTER_PREFIX = ^IP_ADAPTER_PREFIX;
IP_ADAPTER_PREFIX = record
  union: record
    case Integer of
      0: (Alignment: LongInt);
      1: (Length: LongInt; Flags: DWORD);
    end;
  Next : PIP_ADAPTER_PREFIX;
  Address : SOCKET_ADDRESS;
  PrefixLength : LongInt;
end;


//http://msdn.microsoft.com/en-us/library/aa366058(VS.85).aspx

PIP_ADAPTER_ADDRESSES = ^IP_ADAPTER_ADDRESSES;
IP_ADAPTER_ADDRESSES = record
  union: record
    case Integer of
      0: (Alignment: LongInt);
      1: (Length: LongInt; IfIndex: DWORD);
    end;
  Next : PIP_ADAPTER_ADDRESSES;
  AdapterName : PCHAR;
  FirstUnicastAddress : PIP_ADAPTER_UNICAST_ADDRESS;
  FirstAnycastAddress : PIP_ADAPTER_ANYCAST_ADDRESS;
  FirstMulticastAddress : PIP_ADAPTER_MULTICAST_ADDRESS;
  FirstDnsServerAddress : PIP_ADAPTER_DNS_SERVER_ADDRESS;
  DnsSuffix : PWCHAR;
  Description : PWCHAR;
  FriendlyName : PWCHAR;
  PhysicalAdress : array[0..MAX_ADAPTER_ADDRESS_LENGTH - 1] of BYTE;
  PhysicalAdressLength : DWORD;
  Flags : DWORD;
  Mtu : DWORD;
  IfType : DWORD;
// OperStatus : IF_OPER_STATUS;
  Ipv6IfIndex : DWORD;
  ZoneIndices : array[0..15] of DWORD;
  FirstPrefix : PIP_ADAPTER_PREFIX;
  TransmitLinkSpeed : Int64;
  ReceiveLinkSpeed : Int64;
// FirstWinsServerAddress: PIP_ADAPTER_WINS_SERVER_ADDRESS_LH;
// FirstGatewayAddress : PIP_ADAPTER_GATEWAY_ADDRESS_LH;
  Ipv4Metric : LongInt;
  Ipv6Metric : LongInt;
// Luid : IF_LUID;
  Dhcpv4Server : SOCKET_ADDRESS;
// CompartmentId : NET_IF_COMPARTMENT_ID; [This member is not currently supported and is reserved for future use]
// NetworkGuid : NET_IF_NETWORK_GUID;
// ConnectionType : NET_IF_CONNECTION_TYPE;
// TunnelType : TUNNEL_TYPE;
  Dhcpv6Server : SOCKET_ADDRESS;
  Dhcpv6ClientDuid : array[0..MAX_DHCPV6_DUID_LENGTH - 1] of BYTE;
  Dhcpv6ClientDuidLength: LongInt;
  Dhcpv6Iaid : LongInt;
// FirstDnsSuffix : PIP_ADAPTER_DNS_SUFFIX;
end;


PVOID = Pointer;

//http://msdn.microsoft.com/en-us/library/aa365915(VS.85).aspx

function GetAdaptersAddresses(Family: ULONG; Flags: DWORD; Reserved: PVOID;
                             pAdapterAddresses: PIP_ADAPTER_ADDRESSES;
                             pOutBufLen: PULONG): DWORD; stdcall;
                             external 'IPHLPAPI.DLLname 'GetAdaptersAddresses';

implementation

end.
Alles was noch fehlt, bitte mir schreiben, damit ich es hinzufügen kann.
Da ich selber kein Windows Vista verwende, habe ich einige Dinge erstmal kommentiert. Können noch im nachhinein hinzugefügt werden

Danke für eure Hilfe.

Edit:
Fehler gelöst.
Edit2:
Rechtschreibfehler geändert.
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: IP-ADAPTER_ADDRESS Structure

  Alt 7. Dez 2008, 20:19
Hab das ganze mal noch um eine Klasse erweitert, die das Interface beinhaltet um es besser zu verwenden.
Aber da ist mir bei der Anwendung was aufgefallen:
Zitat:
TransmitLinkSpeed

The current speed in bits per second of the transmit link for the adapter.

Note This structure member is only available on Windows Vista and later.
ReceiveLinkSpeed

The current speed in bits per second of the receive link for the adapter.

Note This structure member is only available on Windows Vista and later.
Aber wenn ich nun die Werte, welche ich bei mir als Extended speichere benutzte, sind sie um ein 10-tausendfaches mal größer als sie sollten. Sicher kann ich die Werte einfach als ein 10-tausendstel interpretieren, jedoch würde ich gerne die Ursache des so überhöhten Wertes wissen.
Beispiel:
  FTransmitLinkspeed := aAdapter.TransmitLinkspeed / (8*1024*1024*1024); // MByte/s D.h. Müsste da nun eigentlich ~33 MB/s dastehen. Was steht wirklich da? 3276860.
Kann doch nicht sein, oder hab ich mal wieder einen Blackout?

Achja. Ich poste hier mal nun die wiederum erweitere Version der Unit, ist jedoch immer noch im Aufbau

Delphi-Quellcode:
unit uWinGetAdaptersAddresses;

interface

uses Windows, SysUtils;

const
  MAX_ADAPTER_ADDRESS_LENGTH = 8;
  MAX_DHCPV6_DUID_LENGTH = 130;

  { Which values?
//Family
  AF_INET                        = ;
  AF_INET6                        = ;
  AF_UNSPEC                      = ;
}

//ifType Const
  IF_TYPE_OTHER = 1;
  IF_TYPE_ETHERNET_CSMACD = 6;
  IF_TYPE_ISO88025_TOKENRING = 9;
  IF_TYPE_PPP = 23;
  IF_TYPE_SOFTWARE_LOOPBACK = 24;
  IF_TYPE_ATM = 37;
  IF_TYPE_IEEE80211 = 71;
  IF_TYPE_TUNNEL = 131;
  IF_TYPE_IEEE1394 = 144;

//OperStatus Const
  IfOperStatusUp = 1;
  IfOperStatusDown = 2;
  IfOperStatusTesting = 3;
  IfOperStatusUnknown = 4;
  IfOperStatusDormant = 5;
  IfOperStatusNotPresent = 6;
  IfOperStatusLowerLayerDown = 7;

type
PhysAddrArray = array[0..MAX_ADAPTER_ADDRESS_LENGTH - 1] of BYTE;

//http://msdn.microsoft.com/en-us/library/ms740496(VS.85).aspx

PSOCKADDR = ^SOCKADDR;
SOCKADDR = record
  sa_family : ShortInt;
  sa_data : array[0..13] of Char;
end;


//http://msdn.microsoft.com/en-us/library/ms740507(VS.85).aspx

PSOCKET_ADDRESS = ^SOCKET_ADDRESS;
SOCKET_ADDRESS = record
  lpSocketaddr : PSOCKADDR;
  iSockaddrLength : Integer;
end;

//NET_IF_CONNECTION_TYPE Const
NET_IF_CONNECTION_TYPE = (
  NET_IF_CONNECTION_DEDICATED = 1,
  NET_IF_CONNECTION_PASSIVE = 2,
  NET_IF_CONNECTION_DEMAND = 3,
  NET_IF_CONNECTION_MAXIMUM = 4
);

//http://msdn.microsoft.com/en-us/library/aa366281(VS.85).aspx

IP_PREFIX_ORIGIN = (
  IpPrefixOriginOther = 0,
  IpPrefixOriginManual,
  IpPrefixOriginWellKnown,
  IpPrefixOriginDhcp,
  IpPrefixOriginRouterAdvertisement,
  IpPrefixOriginUnchanged = 16
);


//http://msdn.microsoft.com/en-us/library/aa366283(VS.85).aspx

IP_SUFFIX_ORIGIN = (
  IpSuffixOriginOther = 0,
  IpSuffixOriginManual,
  IpSuffixOriginWellKnown,
  IpSuffixOriginDhcp,
  IpSuffixOriginLinkLayerAddress,
  IpSuffixOriginRandom,
  IpSuffixOriginUnchanged = 16
);


//http://msdn.microsoft.com/en-us/library/aa366069(VS.85).aspx

IP_DAD_STATE = (
  IpDadStateInvalid = 0,
  IpDadStateTentative,
  IpDadStateDuplicate,
  IpDadStateDeprecated,
  IpDadStatePreferred
);

//http://msdn.microsoft.com/en-us/library/aa366066(VS.85).aspx

PIP_ADAPTER_UNICAST_ADDRESS = ^IP_ADAPTER_UNICAST_ADDRESS;
IP_ADAPTER_UNICAST_ADDRESS = record
  union: record
    case Integer of
    0: (Length: LongInt; Flags: DWORD);
    end;
  Next : PIP_ADAPTER_UNICAST_ADDRESS;
  Address : SOCKET_ADDRESS;
  PrefixOrigin : IP_PREFIX_ORIGIN;
  SuffixOrigin : IP_SUFFIX_ORIGIN;
  DadState : IP_DAD_STATE;
  ValidLifeTime : LongInt;
  PreferredLifeTime : LongInt;
  LeaseLifeTime : LongInt;
  OnLinkPrefixLength : array[0..7] of Integer;
end;


//http://msdn.microsoft.com/en-us/library/aa366059(VS.85).aspx

PIP_ADAPTER_ANYCAST_ADDRESS = ^IP_ADAPTER_ANYCAST_ADDRESS;
IP_ADAPTER_ANYCAST_ADDRESS = record
  union: record
    case Integer of
      0: (Alignment: LongInt);
      1: (Length: LongInt; Flags: DWORD);
    end;
  Next : PIP_ADAPTER_ANYCAST_ADDRESS;
  Address : SOCKET_ADDRESS;
end;


//http://msdn.microsoft.com/en-us/library/aa366063(VS.85).aspx

PIP_ADAPTER_MULTICAST_ADDRESS = ^IP_ADAPTER_MULTICAST_ADDRESS;
IP_ADAPTER_MULTICAST_ADDRESS = record
  union: record
    case Integer of
      0: (Alignment: LongInt);
      1: (Length: LongInt; Flags: DWORD);
    end;
  Next : PIP_ADAPTER_MULTICAST_ADDRESS;
  Address : SOCKET_ADDRESS;
end;


//http://msdn.microsoft.com/en-us/library/aa366060(VS.85).aspx

PIP_ADAPTER_DNS_SERVER_ADDRESS = ^IP_ADAPTER_DNS_SERVER_ADDRESS;
IP_ADAPTER_DNS_SERVER_ADDRESS = record
  union: record
    case Integer of
      0: (Alignment: LongInt);
      1: (Length: LongInt; Reserved: DWORD);
    end;
    Next : PIP_ADAPTER_DNS_SERVER_ADDRESS;
    Address : SOCKET_ADDRESS;
end;


//http://msdn.microsoft.com/en-us/library/aa366065(VS.85).aspx

PIP_ADAPTER_PREFIX = ^IP_ADAPTER_PREFIX;
IP_ADAPTER_PREFIX = record
  union: record
    case Integer of
      0: (Alignment: LongInt);
      1: (Length: LongInt; Flags: DWORD);
    end;
  Next : PIP_ADAPTER_PREFIX;
  Address : SOCKET_ADDRESS;
  PrefixLength : LongInt;
end;


//http://msdn.microsoft.com/en-us/library/aa366058(VS.85).aspx

PIP_ADAPTER_ADDRESSES = ^IP_ADAPTER_ADDRESSES;
IP_ADAPTER_ADDRESSES = record
  union: record
    case Integer of
      0: (Alignment: LongInt);
      1: (Length: LongInt; IfIndex: DWORD);
    end;
  Next : PIP_ADAPTER_ADDRESSES;
  AdapterName : PCHAR;
  FirstUnicastAddress : PIP_ADAPTER_UNICAST_ADDRESS;
  FirstAnycastAddress : PIP_ADAPTER_ANYCAST_ADDRESS;
  FirstMulticastAddress : PIP_ADAPTER_MULTICAST_ADDRESS;
  FirstDnsServerAddress : PIP_ADAPTER_DNS_SERVER_ADDRESS;
  DnsSuffix : PWCHAR;
  Description : PWCHAR;
  FriendlyName : PWCHAR;
  PhysicalAdress : PhysAddrArray;
  PhysicalAdressLength : DWORD;
  Flags : DWORD;
  Mtu : DWORD;
  IfType : DWORD;
// OperStatus : IF_OPER_STATUS;
  Ipv6IfIndex : DWORD;
  ZoneIndices : array[0..15] of DWORD;
  FirstPrefix : PIP_ADAPTER_PREFIX;
  TransmitLinkSpeed : Int64;
  ReceiveLinkSpeed : Int64;
// FirstWinsServerAddress: PIP_ADAPTER_WINS_SERVER_ADDRESS_LH;
// FirstGatewayAddress : PIP_ADAPTER_GATEWAY_ADDRESS_LH;
  Ipv4Metric : LongInt;
  Ipv6Metric : LongInt;
// Luid : IF_LUID;
  Dhcpv4Server : SOCKET_ADDRESS;
// CompartmentId : NET_IF_COMPARTMENT_ID; [This member is not currently supported and is reserved for future use]
// NetworkGuid : NET_IF_NETWORK_GUID;
  ConnectionType : NET_IF_CONNECTION_TYPE;
// TunnelType : TUNNEL_TYPE;
  Dhcpv6Server : SOCKET_ADDRESS;
  Dhcpv6ClientDuid : array[0..MAX_DHCPV6_DUID_LENGTH - 1] of BYTE;
  Dhcpv6ClientDuidLength: LongInt;
  Dhcpv6Iaid : LongInt;
// FirstDnsSuffix : PIP_ADAPTER_DNS_SUFFIX;
end;

TAdapter = Class(TObject)
private
  FAdapterName : PChar;
  FFriendlyName : PWChar;
  FDnsSuffix : PWChar;
  FSockAddr : PChar;
  FIpv4Metric : LongInt;
  FTransmitLinkspeed : Extended;
  FReceiveLinkSpeed : Extended;
  FIfType : DWORD;
  FPhysicalAddress : String;

  function GetIfType : string;
  function GetPhysicalAddress : string;
  procedure SetPhysicalAddress(const aPhysAddr : PhysAddrArray; const Len : DWORD);
public
  constructor Create(aAdapter : IP_ADAPTER_ADDRESSES);
  destructor Destroy; override;

  property FriendlyName : PWChar read FFriendlyName;
  property AdapterName : PChar read FAdapterName;
  property DnsSuffix : PWChar read FDnsSuffix;
  property SockAddr : PChar read FSockAddr;
  property Ipv4Metric : LongInt read FIpv4Metric;
  property TransmitLinkspeed : Extended read FTransmitLinkspeed;
  property ReceiveLinkSpeed : Extended read FReceiveLinkSpeed;
  property IfType : String read GetIfType;
  property PhysicalAddress : String read GetPhysicalAddress;
end;


PVOID = Pointer;

//http://msdn.microsoft.com/en-us/library/aa365915(VS.85).aspx

function GetAdaptersAddresses(Family: ULONG; Flags: DWORD; Reserved: PVOID;
                             pAdapterAddresses: PIP_ADAPTER_ADDRESSES;
                             pOutBufLen: PULONG): DWORD; stdcall;
                             external 'IPHLPAPI.DLLname 'GetAdaptersAddresses';

function DecToHex(dec : integer) : String;
implementation

{ TAdaper }

constructor TAdapter.Create(aAdapter: IP_ADAPTER_ADDRESSES);
begin
  inherited Create;
  FAdapterName := aAdapter.AdapterName;
  FFriendlyName := aAdapter.FriendlyName;
  FDnsSuffix := aAdapter.DnsSuffix;
  FSockAddr := aAdapter.Dhcpv4Server.lpSocketaddr^.sa_data;
  FIpv4Metric := aAdapter.Ipv4Metric;
  FTransmitLinkspeed := aAdapter.TransmitLinkspeed / 8589934592; // MByte/s
  FReceiveLinkspeed := aAdapter.ReceiveLinkSpeed / 8589934592;
  FIfType := aAdapter.IfType;
  SetPhysicalAddress(aAdapter.PhysicalAdress, aAdapter.PhysicalAdressLength);
end;

destructor TAdapter.Destroy;
begin
//
  inherited;
end;

function TAdapter.GetIfType: string;
begin
  case FIfType of
    1: result := 'IF_TYPE_OTHER';
    6: result := 'IF_TYPE_ETHERNET_CSMACD';
    9: result := 'IF_TYPE_ISO88025_TOKENRING';
    23: result := 'IF_TYPE_PPP';
    24: result := 'IF_TYPE_SOFTWARE_LOOPBACK';
    37: result := 'IF_TYPE_ATM';
    71: result := 'IF_TYPE_IEEE80211';
    131: result := 'IF_TYPE_TUNNEL';
    144: result := 'IF_TYPE_IEEE1394';
  else result := 'Not set yet';
  end;
end;

function TAdapter.GetPhysicalAddress: string;
begin
  result := FPhysicalAddress;
end;

procedure TAdapter.SetPhysicalAddress(const aPhysAddr: PhysAddrArray;
  const Len: DWORD);
var
  i : integer;
begin
FPhysicalAddress := DecToHex(aPhysAddr[0]);
if len = 0 then exit;
  for i := 1 to len-1 do begin
    FPhysicalAddress := FPhysicalAddress + '-' + DecToHex(aPhysAddr[i]);
  end;
end;

function DecToHex(dec : Integer) : String;
const
  HexArr : array[0..15] of Char = ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F');
var
  tmp : Integer;
begin
result := '';
tmp := 0;
{
HEX |0|1|2|3|4|5|6|7|8|9|A |B |C |D |E |F  represent Array[tmp]
------------------------------------------
DEC |0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15 represent tmp
}


  repeat
    tmp := dec mod 16;
    dec := dec div 16;
    result := HexArr[tmp] + result;
  until (tmp = 0) or (length(result) = 2);
  if result = '0then result := '00';
end;

end.
Wenn es im Quelltext irgendwelche Beanstandungen gibt, einfach hier oder per PN melden

Dann noch eine weitere Frage:
Ich scheine die IPs falsch zu interpretieren:
zB der broadcast
Delphi-Quellcode:
IP_ADAPTER_UNICAST_ADDRESS = record
  union: record
    case Integer of
    0: (Length: LongInt; Flags: DWORD);
    end;
  Next : PIP_ADAPTER_UNICAST_ADDRESS;
  Address : SOCKET_ADDRESS;
  PrefixOrigin : IP_PREFIX_ORIGIN;
  SuffixOrigin : IP_SUFFIX_ORIGIN;
  DadState : IP_DAD_STATE;
  ValidLifeTime : LongInt;
  PreferredLifeTime : LongInt;
  LeaseLifeTime : LongInt;
  OnLinkPrefixLength : array[0..7] of Integer;
end;
drüfte die IP doch in Address.lpSocketaddr^.sa_data zu finden sein!? Wenn ich das auslese, bekomme ich nur wirre Datenmengen -.-"
Wo stehen denn die IPs in dieser komplexen Structure?

Und welche Werte haben AF_INET, AF_INET6 und AF_UNSPEC?

Dangöö
Angehängte Dateien
Dateityp: pas uwingetadaptersaddresses_111.pas (9,9 KB, 56x aufgerufen)
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#9

Re: IP-ADAPTER_ADDRESS Structure

  Alt 8. Dez 2008, 01:14
Zitat von quendolineDD:
Hab das ganze mal noch um eine Klasse erweitert, die das Interface beinhaltet um es besser zu verwenden.
Das "tut man" eigentlich nicht.
Ziel sollte es sein, die Strukturen, Konstanten und Funktionen der Windows API (bzw. eines Teils der API) so gut wie möglich 1:1 in Delphi abzubilden.
Dies ergibt meistens sehr grosse, umfangreiche Units, wie das Jwaxxxxxx Units der Fall ist.
Diese Units "fressen kein Heu", weil sie nur aus Deklarationen bestehen.
Die Windows API-Funktionen sind aus einer Anwendung heraus nur sehr schwer zu benützen.
Man braucht genaues Wissen über die API.
Vergisst man z.B. einen Returnwert abzufragen oder ein Handle freizugeben, führt dies unweigerlich zu Bugs.
Aber dafür hat man eine gut dokumentierte Schnittstelle (siehe MSDN Library).

Die meisten Handle-basierten API-Funktionen schreien geradezu nach einer objektorientierten Kapselung.
Jetzt kommt also die 2. Ebene, die Kapselung der Windows API in Klassen (so wie du das mit der Klasse TAdapter versuchst).
Aber diese Kapselung sollte in einer eigenen Unit (getrennt von den Delarationen der Windows API) abgelegt werden.
Die Anwendung bindet dann nur noch diese Unit ein und bleibt dadurch von den Deklarationen verschont.
Code:
Anwendung --> Kapselung --> Windows API --> Betriebssystem
Wenn du jetzt also deinen bisherigen Code in den Papierkorb wirfst und eine objektorientierte Kapselung um die Jedi Units herumbaust, wirst du den grössten Nutzen rausholen.
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: IP-ADAPTER_ADDRESS Structure

  Alt 8. Dez 2008, 13:26
Aber ich hab ja nicht umsonst die API-Deklarationen mir vorgenommen um schlussletztlich die JEDI Units zu nutzen. Sicherlich sind diese in ihrer Form und Ausprägung dem Nutzen nach besser und effektiver, jedoch mache ich mir den Aufwand bewusst um gewisse Zusammenhänge zu verstehen und auch an sich zu lernen.

Das die Kapselung in einer eigenen Unit stattfinden sollte, gebe ich dir Recht. Der Gedanke kam mir auch schon, gerade eben wegen der Übersichtlichkeit.
Aber die Klasse TAdapter macht in dem Sinne nichts weiter, als die Werte der Adapter "verbraucherfreundlich" zu präsentieren.
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:09 Uhr.
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