[BlueLeaf1336]> PROBLEMS> WinSock>

WinSock - IPアドレス・ネットマスクの一覧取得

historyTOP

2004/04/28:作成

referenceTOP

commentTOP

またまたWinSockではないですが...2番目ということでいってみます。で、再び iphlpapi を使うらしいですが、今度こそそのままのは無いというかありますが無いことにして、自分でやってみましょう。

前回の翻訳状況を真似すればいけることでしょう。

ここに掲載する iphlpapi.pas のコードは、今回の部分だけにしますが、同じユニットに書くことにしますので、ダウンロードしたファイルには前回と今回の両方の翻訳結果が載っています(のはずです)。

で、やってみたら少しだけWinSock使ってますね。ソケットではないですけど。

動いてますが、動いているだけかもしれません。でも動いてます。

code(iphlpapi.pas)TOP

unit IPHLPAPI;

interface

uses
    Windows;

const
    IPHLPAPI_DLL = 'IPHLPAPI.DLL';

const
    MAX_INTERFACE_NAME_LEN             = $100;
    ERROR_SUCCESS                      = 0;
    MAXLEN_IFDESCR                     = $100;
    MAXLEN_PHYSADDR                    = 8;

const
    MIB_IPADDR_PRIMARY      = $0001;    //  Primary IP address
    MIB_IPADDR_DYNAMIC      = $0004;    //  Dynamic IP address
    MIB_IPADDR_DISCONNECTED = $0008;    //  Address is on disconnected interface 
    MIB_IPADDR_DELETED      = $0040;    //  Address is being deleted 
    MIB_IPADDR_TRANSIENT    = $0080;    //  Transient address 

type
    MIB_IPADDRROW = record
        dwAddr      : DWORD;    //  Specifies the IP address
        dwIndex     : DWORD;    //  Specifies the index of the interface
                                //      associated with this IP address
        dwMask      : DWORD;    //  Specifies the subnet mask for the IP address
        dwBCastAddr : DWORD;    //  Specifies the broadcast address. A broadcast
                                //      address is typically the IP address with
                                //      the host portion set to either all zeros
                                //      or all ones
        dwReasmSize : DWORD;    //  Specifies the maximum re-assembly size for
                                //      received datagrams
        unused1     : Word;     //  This member is reserved
        wType       : Word;     //  Specifies the address type or state
    end;

    MIB_IPADDRTABLE = record
        dwNumEntries: DWORD;
        table       : array[0..(MAXLEN_PHYSADDR-1)] of MIB_IPADDRROW;
    end;
    PMIB_IPADDRTABLE = ^MIB_IPADDRTABLE;

function GetIpAddrTable(pIpAddrTable: Pointer; var pdwSize: LongInt;
                        bOrder: LongInt): LongInt;  stdcall;

implementation

function GetIpAddrTable; stdcall; external IPHLPAPI_DLL;

end.

code(Main.pas)TOP

uses
    iphlpapi, WinSock;

procedure TForm1.Button1Click(Sender: TObject);
var
    d: Integer;
    IpAddrTable: PMIB_IPADDRTABLE;
    i: integer;
    Buf: string;
    Addr: TInAddr;
//     in_addr ina;
begin
    d := 0;
    //  第1パラメータにNULLをおいて、必要サイズを取得
    GetIpAddrTable(nil, d, 0);

    //  MIB_IFADDRTABLEへのポインタに、必要サイズを確保する
    IpAddrTable := SysGetMem(d);

    if Assigned(IpAddrTable) then
    begin
        //  アドレステーブルの取得
        if GetIpAddrTable(IpAddrTable, d, 0) = NO_ERROR then
        begin
            //  取得したテーブル数は、dwNumEntriesで分かる
            for i := 0 to IpAddrTable.dwNumEntries - 1 do
            begin
                Memo1.Lines.Add('');

                Buf := Format('dwIndex     0x%8.8x', [IpAddrTable.table[i].dwIndex]);
                Memo1.Lines.Add(Buf);

                Addr.S_addr := IpAddrTable.table[i].dwAddr;
                Buf := Format('dwAddr      %s', [inet_ntoa(Addr)]);
                Memo1.Lines.Add(Buf);

                Addr.S_addr := IpAddrTable.table[i].dwMask;
                Buf := Format('dwMask      %s', [inet_ntoa(Addr)]);
                Memo1.Lines.Add(Buf);

                Addr.S_addr := IpAddrTable.table[i].dwBCastAddr;
                Buf := Format('dwBCastAddr %s', [inet_ntoa(Addr)]);
                Memo1.Lines.Add(Buf);

                Buf := Format('dwReasmSize %d', [IpAddrTable.table[i].dwReasmSize]);
                Memo1.Lines.Add(Buf);

                case IpAddrTable.table[i].wType of
                MIB_IPADDR_PRIMARY     : Buf := 'dwType      MIB_IPADDR_PRIMARY';
                MIB_IPADDR_DYNAMIC     : Buf := 'dwType      MIB_IPADDR_DYNAMIC';
                MIB_IPADDR_DISCONNECTED: Buf := 'dwType      MIB_IPADDR_DISCONNECTED';
                MIB_IPADDR_DELETED     : Buf := 'dwType      MIB_IPADDR_DELETED';
                MIB_IPADDR_TRANSIENT   : Buf := 'dwType      MIB_IPADDR_TRANSIENT';
                end;
                Memo1.Lines.Add(Buf);
            end;
        end;

        //  MIB_IFADDRTABLEへのポインタに、確保したメモリを解放する
        SysFreeMem(IpAddrTable);
    end;
end;

screenshot & downloadTOP

ソースダウンロード
20040428GetIpTable.zip(167,837bytes)

EOFTOP