我程序中有时能从注册表中获取ip信息,但在cmd中用ipconfig获取的ip为空,ipconfig获取的是哪的信息,我怎么用程序得到它?

解决方案 »

  1.   

    如果没有IP地址,一般是你用的是动态分配IP地址(DHCP)
    可以用indy控件.-----------------------------
    http://kmok.cn/
      

  2.   

    unit Unit1;interfaceuses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    Registry, StdCtrls;const
    MAX_ADAPTER_NAME_LENGTH = 256;
    MAX_ADAPTER_DESCRIPTION_LENGTH = 128;
    MAX_ADAPTER_ADDRESS_LENGTH = 8;type
    TIP_ADDRESS_STRING = record
    IPstring: array [0..15] of Char;
    end;
    PIP_ADDRESS_STRING = ^TIP_ADDRESS_STRING;
    TIP_MASK_STRING = TIP_ADDRESS_STRING;
    PIP_MASK_STRING = ^TIP_MASK_STRING;PIP_ADDR_STRING = ^TIP_ADDR_STRING;
    TIP_ADDR_STRING = record
    Next: PIP_ADDR_STRING;
    IpAddress: TIP_ADDRESS_STRING; //IP地址字符串
    IpMask: TIP_MASK_STRING; //子网掩码字符串
    Context: DWORD; //Netword table entry
    end;
    PIP_ADAPTER_INFO = ^TIP_ADAPTER_INFO;
    TIP_ADAPTER_INFO = packed record
    Next: PIP_ADAPTER_INFO;
    ComboIndex: DWORD;
    AdapterName: array [0..MAX_ADAPTER_NAME_LENGTH + 4-1] of Char;
    Description: array [0..MAX_ADAPTER_DESCRIPTION_LENGTH + 4-1] of Char;
    AddressLength: UINT;
    Address: array [0..MAX_ADAPTER_ADDRESS_LENGTH-1] of BYTE;
    Index: DWORD;
    dwType: UINT;
    DhcpEnabled: UINT;
    CurrentIpAddress: PIP_ADDR_STRING;
    IpAddressList: TIP_ADDR_STRING;
    GatewayList: TIP_ADDR_STRING;
    DhcpServer: TIP_ADDR_STRING ;
    HaveWins: BOOL;
    PrimaryWinsServer: TIP_ADDR_STRING;
    SecondaryWinsServer: TIP_ADDR_STRING;
    end;type
    TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    private
    { Private declarations }
    function SearchNetwork(): string;
    public
    { Public declarations }
    end;var
    Form1: TForm1;function GetAdaptersInfo(pAdapterInfo: PIP_ADAPTER_INFO;
    pOutBufLen: PDWORD): DWORD; stdcall;
    external 'IPHLPAPI.DLL' name 'GetAdaptersInfo';implementation{$R *.DFM}function ExtractRegKey(var Path: string): string; // return key
    var
    i: integer;
    begin
    i := Pos('\', Path);
    if i > 1 then
    begin
    Result := Copy(Path, 1, i-1);
    Delete(Path, 1, i);
    end
    else
    begin
    Result := Path;
    Path := '';
    end;end;Function ReadRegStrValue(Path: string; DataName: String): string;
    var
    regfile: TRegistry;
    tstr: string;
    begin
    Result := '';
    regfile := TRegistry.Create();
    try
    tstr := UpperCase(ExtractRegKey(Path));
    if tstr = 'HKEY_CLASSES_ROOT' then
    regfile.RootKey := HKEY_CLASSES_ROOT
    else if tstr = 'HKEY_CURRENT_USER' then
    regfile.RootKey := HKEY_CURRENT_USER
    else if tstr = 'HKEY_LOCAL_MACHINE' then
    regfile.RootKey := HKEY_LOCAL_MACHINE
    else if tstr = 'HKEY_CURRENT_CONFIG' then
    regfile.RootKey := HKEY_CURRENT_CONFIG
    else if tstr = 'HKEY_DYN_DATA' then
    regfile.RootKey := HKEY_DYN_DATA;while Path <> '' do
    begin
    tstr := ExtractRegKey(Path);
    if not regfile.OpenKey(tstr, False) then
    Exit
    end;
    Result := regfile.ReadString(DataName);
    finally
    regfile.Free;
    end;
    end;function TForm1.SearchNetwork(): string;
    var
    pbuf: PIP_ADAPTER_INFO;
    buflen: DWORD;
    i: integer;
    guid: string;
    regfolder: string;
    linkname: string;
    mac: string;
    begin
    Result := '';
    buflen := 0;
    if GetAdaptersInfo(pbuf, @bufLen) = ERROR_BUFFER_OVERFLOW then
    begin
    pbuf := AllocMem(buflen);
    if GetAdaptersInfo(pbuf, @bufLen) = ERROR_SUCCESS then
    while pbuf <> nil do // 找到一个网络连接
    begin
    // pbuf 指向连接信息
    // 此处加入处理代码
    guid := StrPas(pbuf.AdapterName);
    regfolder := 'HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\' + guid + '\Connection';
    linkname := ReadRegStrValue(regfolder, 'name');
    Memo1.Lines.Add(linkname);
    Memo1.Lines.Add('IP: ' + pbuf.IpAddressList.IpAddress.IPstring);
    Memo1.Lines.Add('MASK: ' + pbuf.IpAddressList.IpMask.IPstring);
    Memo1.Lines.Add('Gateway: ' + pbuf.GatewayList.IpAddress.IPstring);
    mac := '';
    for i := 0 to 5 do
    mac := mac + IntToHex(pbuf.Address[i], 2);
    Memo1.Lines.Add('MAC: ' + mac);
    Memo1.Lines.Add('');
    pbuf := pbuf.Next;
    end;
    FreeMem(pbuf);
    end;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
    SearchNetwork();
    end;end.
      

  3.   

    我编译时提示PIP_ADAPTER_INFO没定义,我应该怎么办,需要引用什么单元?