![]() |
IP-ADAPTER_ADDRESS Structure
Hallo DP Comunity ;-)
Ich bin gerade dabei, mir mal die ![]() Jetzt stieß ich auf folgendes:
Code:
Nun hab ich gegoogelt und im Forum gesucht nach MAX_DHCPV6_DUID_LENGTH, kam jedoch zu keinem Ergebnis.
BYTE Dhcpv6ClientDuid[MAX_DHCPV6_DUID_LENGTH];
Weiß jemand von euch, welchen Wert MAX_DHCPV6_DUID_LENGTH hat? In dem Thread ![]() Bisweilen mache ich die noch selbst, eine fertige Übersetzung zu finden (außerhalb der JEDI-Komponenten) wäre natürlich genial. Danke im Vorraus :-) |
Re: IP-ADAPTER_ADDRESS Structure
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.
|
Re: IP-ADAPTER_ADDRESS Structure
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.
|
Re: IP-ADAPTER_ADDRESS Structure
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 :-) |
Re: IP-ADAPTER_ADDRESS Structure
Moin Lars,
falls Du doch noch weiter übersetzen willst: MAX_DHCPV6_DUID_LENGTH ist in der IPTypes.h deklariert, und hat den Wert 130. |
Re: IP-ADAPTER_ADDRESS Structure
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 |
Re: IP-ADAPTER_ADDRESS Structure
Alles klar. Habs nun soweit alles was zur GetAdaptersAddresses Function dazugehört.
Delphi-Quellcode:
Alles was noch fehlt, bitte mir schreiben, damit ich es hinzufügen kann.
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.DLL' name 'GetAdaptersAddresses'; implementation end. 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. |
Re: IP-ADAPTER_ADDRESS Structure
Liste der Anhänge anzeigen (Anzahl: 1)
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:
Beispiel:
Delphi-Quellcode:
D.h. Müsste da nun eigentlich ~33 MB/s dastehen. Was steht wirklich da? 3276860.
FTransmitLinkspeed := aAdapter.TransmitLinkspeed / (8*1024*1024*1024); // MByte/s
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:
Wenn es im Quelltext irgendwelche Beanstandungen gibt, einfach hier oder per PN melden ;-)
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.DLL' name '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 = '0' then result := '00'; end; end. Dann noch eine weitere Frage: Ich scheine die IPs falsch zu interpretieren: zB der broadcast
Delphi-Quellcode:
drüfte die IP doch in Address.lpSocketaddr^.sa_data zu finden sein!? Wenn ich das auslese, bekomme ich nur wirre Datenmengen -.-"
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; Wo stehen denn die IPs in dieser komplexen Structure? Und welche Werte haben AF_INET, AF_INET6 und AF_UNSPEC? Dangöö :-) |
Re: IP-ADAPTER_ADDRESS Structure
Zitat:
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:
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.
Anwendung --> Kapselung --> Windows API --> Betriebssystem
|
Re: IP-ADAPTER_ADDRESS Structure
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz