zoukankan      html  css  js  c++  java
  • delphi 获取网卡信息(支持多网卡)

    delphi 获取网卡信息(支持多网卡)
    
     
    
      unit LGetAdapterInfo;
    
     
    
    interface
    
     
    
    uses
    
    Windows, SysUtils, Classes;
    
     
    
    const
    
    MAX_HOSTNAME_LEN = 128; { from IPTYPES.H }
    
    MAX_DOMAIN_NAME_LEN = 128;
    
    MAX_SCOPE_ID_LEN = 256;
    
    MAX_ADAPTER_NAME_LENGTH = 256;
    
    MAX_ADAPTER_DESCRIPTION_LENGTH = 128;
    
    MAX_ADAPTER_ADDRESS_LENGTH = 8;
    
     
    
    type
    
    TIPAddressString = array[0..4 * 4 - 1] of AnsiChar;
    
     
    
    PIPAddrString = ^TIPAddrString;
    
    TIPAddrString = record
    
    Next: PIPAddrString;
    
    IPAddress: TIPAddressString;
    
    IPMask: TIPAddressString;
    
    Context: Integer;
    
    end;
    
     
    
    PFixedInfo = ^TFixedInfo;
    
    TFixedInfo = record { FIXED_INFO }
    
    HostName: array[0..MAX_HOSTNAME_LEN + 3] of AnsiChar;
    
    DomainName: array[0..MAX_DOMAIN_NAME_LEN + 3] of AnsiChar;
    
    CurrentDNSServer: PIPAddrString;
    
    DNSServerList: TIPAddrString;
    
    NodeType: Integer;
    
    ScopeId: array[0..MAX_SCOPE_ID_LEN + 3] of AnsiChar;
    
    EnableRouting: Integer;
    
    EnableProxy: Integer;
    
    EnableDNS: Integer;
    
    end;
    
     
    
    PIPAdapterInfo = ^TIPAdapterInfo;
    
    TIPAdapterInfo = record { IP_ADAPTER_INFO }
    
    Next: PIPAdapterInfo;
    
    ComboIndex: Integer;
    
    AdapterName: array[0..MAX_ADAPTER_NAME_LENGTH + 3] of AnsiChar;
    
    Description: array[0..MAX_ADAPTER_DESCRIPTION_LENGTH + 3] of AnsiChar;
    
    AddressLength: Integer;
    
    Address: array[1..MAX_ADAPTER_ADDRESS_LENGTH] of Byte;
    
    Index: Integer;
    
    _Type: Integer;
    
    DHCPEnabled: Integer;
    
    CurrentIPAddress: PIPAddrString;
    
    IPAddressList: TIPAddrString;
    
    GatewayList: TIPAddrString;
    
    DHCPServer: TIPAddrString;
    
    HaveWINS: Bool;
    
    PrimaryWINSServer: TIPAddrString;
    
    SecondaryWINSServer: TIPAddrString;
    
    LeaseObtained: Integer;
    
    LeaseExpires: Integer;
    
    end;
    
     
    
    TAdapterInfo = class(TObject)
    
    Index: Integer; //序号
    
    AdapterName: string; //网卡名
    
    IPAddress: string; //IP地址
    
    Subnetmask: string; //子网掩码
    
    Gateway: string; //网关
    
    MacAddress: string; //MAC地址
    
    DHCP: Boolean; //是否是自动分配
    
    DHCPServer: string; //DHCP服务器地址
    
    end;
    
     
    
    function SendARP(ipaddr: ulong; temp: dword; ulmacaddr: pointer;
    
    ulmacaddrleng: pointer): DWord; StdCall;
    
     
    
    function GetAdapterInfo: TList;
    
     
    
    var
    
    AI, Work: PIPAdapterInfo;
    
    Size: Integer;
    
    Res: Integer;
    
    I: Integer;
    
     
    
    implementation
    
     
    
    function SendARP; external 'Iphlpapi.dll' Name 'SendARP';
    
     
    
    function GetAdaptersInfo(AI: PIPAdapterInfo; var BufLen: Integer): Integer;
    
    stdcall; external 'iphlpapi.dll' Name 'GetAdaptersInfo';
    
     
    
    function MACToStr(ByteArr: PByte; Len: Integer): string;
    
    begin
    
    Result := '';
    
    while (Len > 0) do
    
    begin
    
    Result := Result + IntToHex(ByteArr^, 2) + '-';
    
    ByteArr := Pointer(Integer(ByteArr) + SizeOf(Byte));
    
    Dec(Len);
    
    end;
    
    SetLength(Result, Length(Result) - 1); { remove last dash }
    
    end;
    
     
    
    function GetAddrString(Addr: PIPAddrString): string;
    
    begin
    
    Result := '';
    
    while (Addr <> nil) do
    
    begin
    
    Result := Result + 'A: ' + Addr^.IPAddress + ' M: ' + Addr^.IPMask + #13;
    
    Addr := Addr^.Next;
    
    end;
    
    end;
    
     
    
    function TimeTToDateTimeStr(TimeT: Integer): string;
    
    const
    
    UnixDateDelta = 25569; { days between12/31/1899and 1/1/1970 }
    
    var
    
    DT: TDateTime;
    
    TZ: TTimeZoneInformation;
    
    Res: DWord;
    
     
    
    begin
    
    if (TimeT = 0) then
    
    Result := ''
    
    else
    
    begin
    
    { Unix TIME_T is secs since1/1/1970}
    
    DT := UnixDateDelta + (TimeT / (24 * 60 * 60)); { in UTC }
    
    { calculate bias }
    
    Res := GetTimeZoneInformation(TZ);
    
    if (Res = TIME_ZONE_ID_INVALID) then
    
    RaiseLastWin32Error;
    
    if (Res = TIME_ZONE_ID_STANDARD) then
    
    begin
    
    DT := DT - ((TZ.Bias + TZ.StandardBias) / (24 * 60));
    
    Result := DateTimeToStr(DT) + ' ' + WideCharToString(TZ.StandardName);
    
    end
    
    else
    
    begin { daylight saving time }
    
    DT := DT - ((TZ.Bias + TZ.DaylightBias) / (24 * 60));
    
    Result := DateTimeToStr(DT) + ' ' + WideCharToString(TZ.DaylightName);
    
    end;
    
    end;
    
    end;
    
     
    
    function GetAdapterInfo: TList;
    
    var
    
    AAdapterInfo: TAdapterInfo;
    
    AAdapterInfos: TList;
    
    begin
    
    Size := 5120;
    
    GetMem(AI, Size);
    
    Res := GetAdaptersInfo(AI, Size);
    
    if (Res <> ERROR_SUCCESS) then
    
    begin
    
    SetLastError(Res);
    
    RaiseLastWin32Error;
    
    end;
    
    Work := AI;
    
    I := 1;
    
    AAdapterInfos := TList.Create;
    
    repeat
    
    AAdapterInfo := TAdapterInfo.Create;
    
    AAdapterInfo.Index := I;
    
    AAdapterInfo.AdapterName := Work^.Description;
    
    AAdapterInfo.IPAddress := Copy(GetAddrString(@Work^.IPAddressList),
    
    Pos('A: ', GetAddrString(@Work^.IPAddressList)) + 3, Pos(' M: ',
    
    GetAddrString(@Work^.IPAddressList)) - Pos('A: ',
    
    GetAddrString(@Work^.IPAddressList)) - 3);
    
    AAdapterInfo.Subnetmask := Copy(GetAddrString(@Work^.IPAddressList),
    
    Pos(' M: ', GetAddrString(@Work^.IPAddressList)) + 4,
    
    length(GetAddrString(@Work^.IPAddressList)));
    
    AAdapterInfo.Gateway := Copy(GetAddrString(@Work^.GatewayList), Pos('A: ',
    
    GetAddrString(@Work^.GatewayList)) + 3, Pos(' M: ',
    
    GetAddrString(@Work^.GatewayList)) - Pos('A: ',
    
    GetAddrString(@Work^.GatewayList)) - 3);
    
    AAdapterInfo.MacAddress := MACToStr(@Work^.Address, Work^.AddressLength);
    
    AAdapterInfo.DHCP := Work^.DHCPEnabled > 0;
    
    AAdapterInfo.DHCPServer := Copy(GetAddrString(@Work^.DHCPServer), Pos('A: ',
    
    GetAddrString(@Work^.DHCPServer)) + 3, Pos(' M: ',
    
    GetAddrString(@Work^.DHCPServer)) - Pos('A: ',
    
    GetAddrString(@Work^.DHCPServer)) - 3);
    
    AAdapterInfos.Add(AAdapterInfo);
    
    Inc(I);
    
    Work := Work^.Next;
    
    until (Work = nil);
    
    Result :=AAdapterInfos;
    
    FreeMem(AI);
    
    end;
    
     
    
    end.
    
     
    
     
    
    使用方法 :
    
     
    
    procedure TForm1.Button2Click(Sender: TObject);
    
    var
    
    aa:TList;
    
    i :Integer;
    
    begin
    
    aa :=GetAdapterInfo;
    
    for i := 0 to aa.Count - 1 do
    
    begin
    
     
    
    Memo1.Lines.Add(TAdapterInfo(aa.Items[i]).AdapterName);
    
     
    
    end;
    
    end;
  • 相关阅读:
    FPGA之verilog流水灯小程序
    FPGA之Verilog点灯小程序
    FPGA学习入门
    机试题 (用 hash 实现部门管理系统 只记得大概的内容,简洁版) -- 上一篇的优化
    机试题 (用 hash 实现部门管理系统 只记得大概的内容,简洁版) --> 这里改成文件管理系统
    双向循环链表 (只需要一个 head 节点), 从头尾部 删除 插入 数据都比较方便
    使用 head + tail 两个头尾节点实现双向链表 (队列太多会占用内存), 数据的添加删除比较方便
    线程学习
    堆排序演示 ( 这个 堆排函数将适合所有的堆排, 只需要改一下比较函数)
    windows10 下访问 virtualbox 虚拟机的linux15.10/16.04 系统 及 用 putty 访问虚拟机的配置
  • 原文地址:https://www.cnblogs.com/m0488/p/9436175.html
Copyright © 2011-2022 走看看