[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 |