[BlueLeaf1336]> PROBLEMS> WinSock>
history | TOP |
2004/04/28:作成
reference | TOP |
comment | TOP |
またまた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 & download | TOP |
ソースダウンロード
20040428GetIpTable.zip(167,837bytes)
EOF | TOP |