[BlueLeaf1336]> PROBLEMS> WinSock>
| history | TOP |
2004/04/27:作成
| reference | TOP |
| comment | TOP |
えぇ、そうです。私がやったんです...。という気持になって逆にすっきりするぐらいにそのまんまです。ここと。どちらが先かはわからないんですが、上記の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 & download | TOP |
ソースダウンロード
20040427GetIfTable.zip(167,886bytes)
| EOF | TOP |