[BlueLeaf1336]> PROBLEMS> WinSock>

WinSock - インターフェースの一覧取得

historyTOP

2004/04/27:作成

referenceTOP

commentTOP

えぇ、そうです。私がやったんです...。という気持になって逆にすっきりするぐらいにそのまんまです。ここと。どちらが先かはわからないんですが、上記の2つのサイトは間違いなく(強気)同一の表現のBCB版とDelphi版だと思います(弱気)。

ここに記載したコードは、Delphi版をそのままパクリ、IntToStr/IntToHexを使用していたところをBCB版に近づくようにFormat関数を使用するようにして無駄に行数を増やし...じゃなくて横の長さを縮めただけのものです。

だいたい、iphlpapi.pas もDelphiサイトからパクッてます。すみません。私がやりました...。

あああああ、WinSockじゃないヨ。

code(iphlpapi.pas)TOP

unit IPHLPAPI;

interface

uses
    Windows, Messages, SysUtils, Variants, Classes;

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

    MIB_IF_OPER_STATUS_NON_OPERATIONAL = 0 ;
    MIB_IF_OPER_STATUS_UNREACHABLE     = 1;
    MIB_IF_OPER_STATUS_DISCONNECTED    = 2;
    MIB_IF_OPER_STATUS_CONNECTING      = 3;
    MIB_IF_OPER_STATUS_CONNECTED       = 4;
    MIB_IF_OPER_STATUS_OPERATIONAL     = 5;

    MIB_IF_TYPE_OTHER                  = 1;
    MIB_IF_TYPE_ETHERNET               = 6;
    MIB_IF_TYPE_TOKENRING              = 9;
    MIB_IF_TYPE_FDDI                   = 15;
    MIB_IF_TYPE_PPP                    = 23;
    MIB_IF_TYPE_LOOPBACK               = 24;
    MIB_IF_TYPE_SLIP                   = 28;

    MIB_IF_ADMIN_STATUS_UP             = 1;
    MIB_IF_ADMIN_STATUS_DOWN           = 2;
    MIB_IF_ADMIN_STATUS_TESTING        = 3;


type
    MIB_IFROW = record
        wszName           : array[0..(MAX_INTERFACE_NAME_LEN * 2-1)] of char;
        dwIndex           : LongInt;
        dwType            : LongInt;
        dwMtu             : LongInt;
        dwSpeed           : LongInt;
        dwPhysAddrLen     : LongInt;
        bPhysAddr         : array[0..(MAXLEN_PHYSADDR - 1)] of Byte;
        dwAdminStatus     : LongInt;
        dwOperStatus      : LongInt;
        dwLastChange      : LongInt;
        dwInOctets        : LongInt;
        dwInUcastPkts     : LongInt;
        dwInNUcastPkts    : LongInt;
        dwInDiscards      : LongInt;
        dwInErrors        : LongInt;
        dwInUnknownProtos : LongInt;
        dwOutOctets       : LongInt;
        dwOutUcastPkts    : LongInt;
        dwOutNUcastPkts   : LongInt;
        dwOutDiscards     : LongInt;
        dwOutErrors       : LongInt;
        dwOutQLen         : LongInt;
        dwDescrLen        : LongInt;
        bDescr            : array[0..(MAXLEN_IFDESCR - 1)] of char;
    end;

    MIB_IFTABLE = record
        dwNumEntries: DWORD;
        table       : array[0..(MAXLEN_PHYSADDR-1)] of MIB_IFROW;
    end;
    PMIB_IFTABLE = ^MIB_IFTABLE;

function GetIfTable(pIfTable: Pointer; var pdwSize: LongInt; bOrder: LongInt): LongInt;  stdcall;

implementation

function GetIfTable; stdcall; external 'IPHLPAPI.DLL';

end.

code(Main.pas)TOP

uses
    iphlpapi;

procedure TForm1.Button1Click(Sender: TObject);
var
    d: Integer;
    IfTable: PMIB_IFTABLE;
    i: integer;
    Buf: string;
begin
    d := 0;
    //  第1パラメータにNULLをおいて、必要サイズを取得
    GetIfTable(nil, d, 0);
    //  MIB_IFTABLEへのポインタに、必要サイズを確保する
    IfTable := SysGetMem(d);

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

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

                case IfTable.table[i].dwType of
                MIB_IF_TYPE_OTHER    : Buf := 'dwType            MIB_IF_TYPE_OTHER';
                MIB_IF_TYPE_ETHERNET : Buf := 'dwType            MIB_IF_TYPE_ETHERNET';
                MIB_IF_TYPE_TOKENRING: Buf := 'dwType            MIB_IF_TYPE_TOKENRING';
                MIB_IF_TYPE_FDDI     : Buf := 'dwType            MIB_IF_TYPE_FDDI';
                MIB_IF_TYPE_PPP      : Buf := 'dwType            MIB_IF_TYPE_PPP';
                MIB_IF_TYPE_LOOPBACK : Buf := 'dwType            MIB_IF_TYPE_LOOPBACK';
                MIB_IF_TYPE_SLIP     : Buf := 'dwType            MIB_IF_TYPE_SLIP';
                end;
                Memo1.Lines.Add(Buf);

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

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

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

                Buf := Format('bPhysAddr         %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x', [
                      IfTable.table[i].bPhysAddr[0]
                    , IfTable.table[i].bPhysAddr[1]
                    , IfTable.table[i].bPhysAddr[2]
                    , IfTable.table[i].bPhysAddr[3]
                    , IfTable.table[i].bPhysAddr[4]
                    , IfTable.table[i].bPhysAddr[5]
                    ]);
                Memo1.Lines.Add(Buf);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                IfTable.table[i].bDescr[IfTable.table[i].dwDescrLen] := #0;
                Buf := Format('bDescr            %s', [IfTable.table[i].bDescr]);
                Memo1.Lines.Add(Buf);
            end;
        end;
        //  MIB_IFTABLEへのポインタに、確保したメモリを解放する
        SysFreeMem(IfTable);
    end;
end;

screenshot & downloadTOP

ソースダウンロード
20040427GetIfTable.zip(167,886bytes)

EOFTOP