Win32 API 日本語リファレンス
ホームNetworkManagement.IpHelper › ResolveIpNetEntry2

ResolveIpNetEntry2

関数
指定IPアドレスの物理アドレスを解決し近隣エントリに格納する。
DLLIPHLPAPI.dll呼出規約winapi対応OSWindows Vista 以降

シグネチャ

// IPHLPAPI.dll
#include <windows.h>

WIN32_ERROR ResolveIpNetEntry2(
    MIB_IPNET_ROW2* Row,
    const SOCKADDR_INET* SourceAddress   // optional
);

パラメーター

名前方向説明
RowMIB_IPNET_ROW2*inout近隣 IP アドレスエントリの MIB_IPNET_ROW2 構造体エントリへのポインター。正常に復帰すると、この構造体は近隣 IP アドレスのプロパティで更新されます。
SourceAddressSOCKADDR_INET*inoptional近隣 IP アドレスエントリに対する要求の送信に使用するインターフェイスを選択するための、省略可能な送信元 IP アドレスへのポインター。

戻り値の型: WIN32_ERROR

公式ドキュメント

ローカルコンピューター上の近隣 IP アドレスエントリの物理アドレスを解決します。(ResolveIpNetEntry2)

戻り値

関数が成功した場合、戻り値は NO_ERROR です。

関数が失敗した場合、戻り値は次のいずれかのエラーコードです。

戻り値 説明
ERROR_BAD_NET_NAME
ネットワーク名が見つかりません。このエラーは、近隣 IP アドレスを持つネットワークに到達できない場合に返されます。
ERROR_INVALID_PARAMETER
無効なパラメーターが関数に渡されました。このエラーは、Row パラメーターに NULL ポインターが渡された場合、Row パラメーターが指す MIB_IPNET_ROW2Address メンバーが有効な IPv4 または IPv6 アドレスに設定されていない場合、または Row パラメーターが指す MIB_IPNET_ROW2InterfaceLuid および InterfaceIndex メンバーの両方が指定されていない場合に返されます。このエラーは、Address メンバーにループバックアドレスが渡された場合にも返されます。
ERROR_NOT_FOUND
指定されたインターフェイスが見つかりませんでした。このエラーは、Row パラメーターが指す MIB_IPNET_ROW2InterfaceLuid または InterfaceIndex メンバーで指定されたネットワークインターフェイスが見つからなかった場合に返されます。
ERROR_NOT_SUPPORTED
要求がサポートされていません。このエラーは、ローカルコンピューターに IPv4 スタックが存在せず、Row パラメーターが指す MIB_IPNET_ROW2Address メンバーに IPv4 アドレスが指定された場合、またはローカルコンピューターに IPv6 スタックが存在せず、Address メンバーに IPv6 アドレスが指定された場合に返されます。
その他
返されたエラーのメッセージ文字列を取得するには、 FormatMessage を使用してください。

解説(Remarks)

ResolveIpNetEntry2 関数は、Windows Vista 以降で定義されています。

ResolveIpNetEntry2 関数は、ローカルコンピューター上の近隣 IP アドレスエントリの物理アドレスを解決するために使用します。この関数は、インターフェイス上で IP アドレスに一致する既存の近隣エントリをすべてフラッシュし、IPv4 アドレスの場合は ARP 要求を、IPv6 アドレスの場合は近隣要請(neighbor solicitation)要求を送信することで物理アドレス(MAC)アドレスを解決します。 SourceAddress パラメーターが指定されている場合、ResolveIpNetEntry2 関数は、この送信元 IP アドレスを持つインターフェイスを要求の送信に使用するインターフェイスとして選択します。 SourceAddress パラメーターが指定されていない場合(このパラメーターに NULL が渡された場合)、ResolveIpNetEntry2 関数は、要求の送信に使用する最適なインターフェイスを自動的に選択します。

Row パラメーターが指す MIB_IPNET_ROW2 構造体の Address メンバーは、有効な IPv4 または IPv6 アドレスおよびファミリーに初期化されている必要があります。さらに、Row パラメーターが指す MIB_IPNET_ROW2 構造体の次のメンバーのうち少なくとも 1 つがインターフェイスに初期化されている必要があります: InterfaceLuid または InterfaceIndex

これらのフィールドは、上記に列挙した順序で使用されます。したがって、InterfaceLuid が指定されている場合は、このメンバーを使用してユニキャスト IP アドレスを追加するインターフェイスが決定されます。InterfaceLuid メンバーに値が設定されていない場合(このメンバーの値がゼロに設定されている場合)、次に InterfaceIndex メンバーを使用してインターフェイスが決定されます。

Row パラメーターが指す MIB_IPNET_ROW2Address メンバーに渡された IP アドレスが、インターフェイス上の既存の近隣 IP アドレスと重複している場合、ResolveIpNetEntry2 関数は IP アドレスを解決する前に既存のエントリをフラッシュします。

呼び出しが成功した場合の出力時に、ResolveIpNetEntry2 は近隣 IP アドレスのその他のプロパティを取得し、Row パラメーターが指す MIB_IPNET_ROW2 構造体に値を設定します。Row パラメーターが指す MIB_IPNET_ROW2 構造体の PhysicalAddress および PhysicalAddressLength メンバーは、有効な物理アドレスに初期化されます。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での呼び出し定義

// IPHLPAPI.dll
#include <windows.h>

WIN32_ERROR ResolveIpNetEntry2(
    MIB_IPNET_ROW2* Row,
    const SOCKADDR_INET* SourceAddress   // optional
);
[DllImport("IPHLPAPI.dll", ExactSpelling = true)]
static extern uint ResolveIpNetEntry2(
    IntPtr Row,   // MIB_IPNET_ROW2* in/out
    IntPtr SourceAddress   // SOCKADDR_INET* optional
);
<DllImport("IPHLPAPI.dll", ExactSpelling:=True)>
Public Shared Function ResolveIpNetEntry2(
    Row As IntPtr,   ' MIB_IPNET_ROW2* in/out
    SourceAddress As IntPtr   ' SOCKADDR_INET* optional
) As UInteger
End Function
' Row : MIB_IPNET_ROW2* in/out
' SourceAddress : SOCKADDR_INET* optional
Declare PtrSafe Function ResolveIpNetEntry2 Lib "iphlpapi" ( _
    ByVal Row As LongPtr, _
    ByVal SourceAddress As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

ResolveIpNetEntry2 = ctypes.windll.iphlpapi.ResolveIpNetEntry2
ResolveIpNetEntry2.restype = wintypes.DWORD
ResolveIpNetEntry2.argtypes = [
    ctypes.c_void_p,  # Row : MIB_IPNET_ROW2* in/out
    ctypes.c_void_p,  # SourceAddress : SOCKADDR_INET* optional
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('IPHLPAPI.dll')
ResolveIpNetEntry2 = Fiddle::Function.new(
  lib['ResolveIpNetEntry2'],
  [
    Fiddle::TYPE_VOIDP,  # Row : MIB_IPNET_ROW2* in/out
    Fiddle::TYPE_VOIDP,  # SourceAddress : SOCKADDR_INET* optional
  ],
  -Fiddle::TYPE_INT)
#[link(name = "iphlpapi")]
extern "system" {
    fn ResolveIpNetEntry2(
        Row: *mut MIB_IPNET_ROW2,  // MIB_IPNET_ROW2* in/out
        SourceAddress: *const SOCKADDR_INET  // SOCKADDR_INET* optional
    ) -> u32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("IPHLPAPI.dll")]
public static extern uint ResolveIpNetEntry2(IntPtr Row, IntPtr SourceAddress);
"@
$api = Add-Type -MemberDefinition $sig -Name 'IPHLPAPI_ResolveIpNetEntry2' -Namespace Win32 -PassThru
# $api::ResolveIpNetEntry2(Row, SourceAddress)
#uselib "IPHLPAPI.dll"
#func global ResolveIpNetEntry2 "ResolveIpNetEntry2" sptr, sptr
; ResolveIpNetEntry2 varptr(Row), varptr(SourceAddress)   ; 戻り値は stat
; Row : MIB_IPNET_ROW2* in/out -> "sptr"
; SourceAddress : SOCKADDR_INET* optional -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "IPHLPAPI.dll"
#cfunc global ResolveIpNetEntry2 "ResolveIpNetEntry2" var, var
; res = ResolveIpNetEntry2(Row, SourceAddress)
; Row : MIB_IPNET_ROW2* in/out -> "var"
; SourceAddress : SOCKADDR_INET* optional -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; WIN32_ERROR ResolveIpNetEntry2(MIB_IPNET_ROW2* Row, SOCKADDR_INET* SourceAddress)
#uselib "IPHLPAPI.dll"
#cfunc global ResolveIpNetEntry2 "ResolveIpNetEntry2" var, var
; res = ResolveIpNetEntry2(Row, SourceAddress)
; Row : MIB_IPNET_ROW2* in/out -> "var"
; SourceAddress : SOCKADDR_INET* optional -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	iphlpapi = windows.NewLazySystemDLL("IPHLPAPI.dll")
	procResolveIpNetEntry2 = iphlpapi.NewProc("ResolveIpNetEntry2")
)

// Row (MIB_IPNET_ROW2* in/out), SourceAddress (SOCKADDR_INET* optional)
r1, _, err := procResolveIpNetEntry2.Call(
	uintptr(Row),
	uintptr(SourceAddress),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // WIN32_ERROR
function ResolveIpNetEntry2(
  Row: Pointer;   // MIB_IPNET_ROW2* in/out
  SourceAddress: Pointer   // SOCKADDR_INET* optional
): DWORD; stdcall;
  external 'IPHLPAPI.dll' name 'ResolveIpNetEntry2';
result := DllCall("IPHLPAPI\ResolveIpNetEntry2"
    , "Ptr", Row   ; MIB_IPNET_ROW2* in/out
    , "Ptr", SourceAddress   ; SOCKADDR_INET* optional
    , "UInt")   ; return: WIN32_ERROR
●ResolveIpNetEntry2(Row, SourceAddress) = DLL("IPHLPAPI.dll", "dword ResolveIpNetEntry2(void*, void*)")
# 呼び出し: ResolveIpNetEntry2(Row, SourceAddress)
# Row : MIB_IPNET_ROW2* in/out -> "void*"
# SourceAddress : SOCKADDR_INET* optional -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "iphlpapi" fn ResolveIpNetEntry2(
    Row: [*c]MIB_IPNET_ROW2, // MIB_IPNET_ROW2* in/out
    SourceAddress: [*c]SOCKADDR_INET // SOCKADDR_INET* optional
) callconv(std.os.windows.WINAPI) u32;
proc ResolveIpNetEntry2(
    Row: ptr MIB_IPNET_ROW2,  # MIB_IPNET_ROW2* in/out
    SourceAddress: ptr SOCKADDR_INET  # SOCKADDR_INET* optional
): uint32 {.importc: "ResolveIpNetEntry2", stdcall, dynlib: "IPHLPAPI.dll".}
pragma(lib, "iphlpapi");
extern(Windows)
uint ResolveIpNetEntry2(
    MIB_IPNET_ROW2* Row,   // MIB_IPNET_ROW2* in/out
    SOCKADDR_INET* SourceAddress   // SOCKADDR_INET* optional
);
ccall((:ResolveIpNetEntry2, "IPHLPAPI.dll"), stdcall, UInt32,
      (Ptr{MIB_IPNET_ROW2}, Ptr{SOCKADDR_INET}),
      Row, SourceAddress)
# Row : MIB_IPNET_ROW2* in/out -> Ptr{MIB_IPNET_ROW2}
# SourceAddress : SOCKADDR_INET* optional -> Ptr{SOCKADDR_INET}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
uint32_t ResolveIpNetEntry2(
    void* Row,
    void* SourceAddress);
]]
local iphlpapi = ffi.load("iphlpapi")
-- iphlpapi.ResolveIpNetEntry2(Row, SourceAddress)
-- Row : MIB_IPNET_ROW2* in/out
-- SourceAddress : SOCKADDR_INET* optional
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('IPHLPAPI.dll');
const ResolveIpNetEntry2 = lib.func('__stdcall', 'ResolveIpNetEntry2', 'uint32_t', ['void *', 'void *']);
// ResolveIpNetEntry2(Row, SourceAddress)
// Row : MIB_IPNET_ROW2* in/out -> 'void *'
// SourceAddress : SOCKADDR_INET* optional -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("IPHLPAPI.dll", {
  ResolveIpNetEntry2: { parameters: ["pointer", "pointer"], result: "u32" },
});
// lib.symbols.ResolveIpNetEntry2(Row, SourceAddress)
// Row : MIB_IPNET_ROW2* in/out -> "pointer"
// SourceAddress : SOCKADDR_INET* optional -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
uint32_t ResolveIpNetEntry2(
    void* Row,
    void* SourceAddress);
C, "IPHLPAPI.dll");
// $ffi->ResolveIpNetEntry2(Row, SourceAddress);
// Row : MIB_IPNET_ROW2* in/out
// SourceAddress : SOCKADDR_INET* optional
// 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
// WINAPI(stdcall): x64 では呼出規約が統一されるため問題なし。x86 では __stdcall 対応のラッパが必要な場合あり。
import com.sun.jna.*;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;

public interface Iphlpapi extends StdCallLibrary {
    Iphlpapi INSTANCE = Native.load("iphlpapi", Iphlpapi.class);
    int ResolveIpNetEntry2(
        Pointer Row,   // MIB_IPNET_ROW2* in/out
        Pointer SourceAddress   // SOCKADDR_INET* optional
    );
}
@[Link("iphlpapi")]
lib LibIPHLPAPI
  fun ResolveIpNetEntry2 = ResolveIpNetEntry2(
    Row : MIB_IPNET_ROW2*,   # MIB_IPNET_ROW2* in/out
    SourceAddress : SOCKADDR_INET*   # SOCKADDR_INET* optional
  ) : UInt32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef ResolveIpNetEntry2Native = Uint32 Function(Pointer<Void>, Pointer<Void>);
typedef ResolveIpNetEntry2Dart = int Function(Pointer<Void>, Pointer<Void>);
final ResolveIpNetEntry2 = DynamicLibrary.open('IPHLPAPI.dll')
    .lookupFunction<ResolveIpNetEntry2Native, ResolveIpNetEntry2Dart>('ResolveIpNetEntry2');
// Row : MIB_IPNET_ROW2* in/out -> Pointer<Void>
// SourceAddress : SOCKADDR_INET* optional -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function ResolveIpNetEntry2(
  Row: Pointer;   // MIB_IPNET_ROW2* in/out
  SourceAddress: Pointer   // SOCKADDR_INET* optional
): DWORD; stdcall;
  external 'IPHLPAPI.dll' name 'ResolveIpNetEntry2';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "ResolveIpNetEntry2"
  c_ResolveIpNetEntry2 :: Ptr () -> Ptr () -> IO Word32
-- Row : MIB_IPNET_ROW2* in/out -> Ptr ()
-- SourceAddress : SOCKADDR_INET* optional -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let resolveipnetentry2 =
  foreign "ResolveIpNetEntry2"
    ((ptr void) @-> (ptr void) @-> returning uint32_t)
(* Row : MIB_IPNET_ROW2* in/out -> (ptr void) *)
(* SourceAddress : SOCKADDR_INET* optional -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library iphlpapi (t "IPHLPAPI.dll"))
(cffi:use-foreign-library iphlpapi)

(cffi:defcfun ("ResolveIpNetEntry2" resolve-ip-net-entry2 :convention :stdcall) :uint32
  (row :pointer)   ; MIB_IPNET_ROW2* in/out
  (source-address :pointer))   ; SOCKADDR_INET* optional
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $ResolveIpNetEntry2 = Win32::API::More->new('IPHLPAPI',
    'DWORD ResolveIpNetEntry2(LPVOID Row, LPVOID SourceAddress)');
# my $ret = $ResolveIpNetEntry2->Call($Row, $SourceAddress);
# Row : MIB_IPNET_ROW2* in/out -> LPVOID
# SourceAddress : SOCKADDR_INET* optional -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

公式の関連項目
使用する型