读取多网卡信息,搜索下来,需要调用Windows iphlpapi.dll,但网上的都是Copy来Copy去的,我的环境是Delphi 2010+Win7 64位,绝大部分的例程都是不能使用的。谁能给个简单示例,来Step By Step.多谢了。

解决方案 »

  1.   

    目前已经可以获取大部分正确信息
    Adapter 3
      ComboIndex: 10
      Adapter name: {657A5299-1D3D-4A23-9167-A19FA781DBAE}
      Description: Broadcom 4313GN 802.11b/g/n 1x1 Wi-Fi 
      Adapter address: E0-06-E6-59-79-4E
      Index: 10
      Type: 71
      DHCP: 1
      Current IP: 
      IP addresses: A: 㤱⸲㘱⸸〱⸰〱1㔲⸵㔲⸵㔲⸵0 M: ꣀ敤  DHCP servers: A:  M:   Has WINS: 16
      Lease obtained: 
      Lease expires: IP地址部分无法正确获取
    租约时间无法获取
    租约过期时间无法获取是否Delphi 2010 或者是iphlpapi.dll版本的问题?
    Win7 64位下的iphlpapi.dll版本为6.1.7601.17514
    WinXP 32位下的iphlpapi.dll版本为5.1.2600.5512兄弟们帮忙啊。
      

  2.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TIPMainForm = class(TForm)
        Info: TMemo;
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
        Procedure GetNetworkParameters;
        Procedure GetAdapterInformation;
      public
        { Public declarations }
      end;var
      IPMainForm: TIPMainForm;implementation{$R *.DFM}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 Char;  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 Char;
        DomainName       : Array[0..MAX_DOMAIN_NAME_LEN+3] of Char;
        CurrentDNSServer : PIPAddrString;
        DNSServerList    : TIPAddrString;
        NodeType         : Integer;
        ScopeId          : Array[0..MAX_SCOPE_ID_LEN+3] of Char;
        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;Function GetNetworkParams(FI : PFixedInfo; Var BufLen : Integer) : Integer;
             StdCall; External 'iphlpapi.dll' Name 'GetNetworkParams';Function GetAdaptersInfo(AI : PIPAdapterInfo; Var BufLen : Integer) : Integer;
             StdCall; External 'iphlpapi.dll' Name 'GetAdaptersInfo';procedure TIPMainForm.FormCreate(Sender: TObject);
    begin
    //  GetNetworkParameters;
      GetAdapterInformation;
    end;procedure TIPMainForm.GetAdapterInformation;
    Var
      AI,Work : PIPAdapterInfo;
      Size    : Integer;
      Res     : Integer;
      I       : Integer;  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 between 12/31/1899 and 1/1/1970 }
      Var
        DT  : TDateTime;
        TZ  : TTimeZoneInformation;
        Res : DWord;  Begin
        If (TimeT = 0) Then Result := ''
        Else Begin
          { Unix TIME_T is secs since 1/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;begin
      Size := 5120;
      GetMem(AI,Size);
      Res := GetAdaptersInfo(AI,Size);
      If (Res <> ERROR_SUCCESS) Then Begin
        SetLastError(Res);
        RaiseLastWin32Error;
      End;
      With Info,Lines do Begin
        Work := AI;
        I := 1;
        Repeat
          Add('');
          Add('Adapter '+IntToStr(I));
          Add('  ComboIndex: '+IntToStr(Work^.ComboIndex));
          Add('  Adapter name: '+Work^.AdapterName);
          Add('  Description: '+Work^.Description);
          Add('  Adapter address: '+MACToStr(@Work^.Address,Work^.AddressLength));
          Add('  Index: '+IntToStr(Work^.Index));
          Add('  Type: '+IntToStr(Work^._Type));
          Add('  DHCP: '+IntToStr(Work^.DHCPEnabled));
          Add('  Current IP: '+GetAddrString(Work^.CurrentIPAddress));
          Add('  IP addresses: '+GetAddrString(@Work^.IPAddressList));
    //      Add('  Gateways: '+GetAddrString(@Work^.GatewayList));
          Add('  DHCP servers: '+GetAddrString(@Work^.DHCPServer));
          Add('  Has WINS: '+IntToStr(Integer(Work^.HaveWINS)));
    //      Add('  Primary WINS: '+GetAddrString(@Work^.PrimaryWINSServer));
    //      Add('  Secondary WINS: '+GetAddrString(@Work^.SecondaryWINSServer));
          Add('  Lease obtained: '+TimeTToDateTimeStr(Work^.LeaseObtained));
          Add('  Lease expires: '+TimeTToDateTimeStr(Work^.LeaseExpires));
          Inc(I);
          Work := Work^.Next;
        Until (Work = nil);
      End;
      FreeMem(AI);
    end;procedure TIPMainForm.GetNetworkParameters;
    Var
      FI   : PFixedInfo;
      Size : Integer;
      Res  : Integer;
      I    : Integer;
      DNS  : PIPAddrString;begin
      Size := 1024;
      GetMem(FI,Size);
      Res := GetNetworkParams(FI,Size);
      If (Res <> ERROR_SUCCESS) Then Begin
        SetLastError(Res);
        RaiseLastWin32Error;
      End;
      With Info,Lines do Begin
        Clear;
        Add('Host name: '+FI^.HostName);
        Add('Domain name: '+FI^.DomainName);
        If (FI^.CurrentDNSServer <> nil) Then
          Add('Current DNS Server: '+FI^.CurrentDNSServer^.IPAddress)
        Else Add('Current DNS Server: (none)');
        I := 1;
        DNS := @FI^.DNSServerList;
        Repeat
          Add('DNS '+IntToStr(I)+': '+DNS^.IPAddress);
          Inc(I);
          DNS := DNS^.Next;
        Until (DNS = nil);
        Add('Scope ID: '+FI^.ScopeId);
        Add('Routing: '+IntToStr(FI^.EnableRouting));
        Add('Proxy: '+IntToStr(FI^.EnableProxy));
        Add('DNS: '+IntToStr(FI^.EnableDNS));
      End;
      FreeMem(FI);
    end;end.
      

  3.   

    获取IP:http://blog.csdn.net/zhnglicho/article/details/6793666
    其他不懂了。。帮你一下吧!
      

  4.   

    估计问题出在char的AnsiChar及WideChar、string的AnsiString及WideString类型使用处理上。
      

  5.   


    是的,所以,在
    [Code]
      AdapterName : Array[0..MAX_ADAPTER_NAME_LENGTH+3] of AnsiChar;
      Description : Array[0..MAX_ADAPTER_DESCRIPTION_LENGTH+3] of AnsiChar;
    [/Code]我改成AnsiChar后,AdapterName和Description正常了。
      

  6.   


    是的,所以,在
      AdapterName : Array[0..MAX_ADAPTER_NAME_LENGTH+3] of AnsiChar;
      Description : Array[0..MAX_ADAPTER_DESCRIPTION_LENGTH+3] of AnsiChar;
    我改成AnsiChar后,AdapterName和Description正常了。
      

  7.   

    问题解决,所有Char改为AnsiChar