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

ParseNetworkString

関数
ネットワークアドレス文字列を解析し構成要素に分解する。
DLLIPHLPAPI.dll呼出規約winapi対応OSWindows Vista 以降

シグネチャ

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

DWORD ParseNetworkString(
    LPCWSTR NetworkString,
    DWORD Types,
    NET_ADDRESS_INFO* AddressInfo,   // optional
    WORD* PortNumber,   // optional
    BYTE* PrefixLength   // optional
);

パラメーター

名前方向説明
NetworkStringLPCWSTRin解析対象の NULL 終端ネットワーク文字列へのポインター。
TypesDWORDin

解析する IP ネットワーク文字列の型。このパラメーターは、Iphlpapi.h ヘッダー ファイルで定義されているネットワーク文字列型のいずれか 1 つで構成されます。

意味
NET_STRING_IPV4_ADDRESS
0x00000001
NetworkString パラメーターは、インターネット標準のドット区切り 10 進表記を使用した IPv4 アドレスを指します。 ネットワーク文字列にネットワーク ポートやプレフィックスが含まれていてはなりません。

ネットワーク文字列の例を次に示します。

192.168.100.10

NET_STRING_IPV4_SERVICE
0x00000002
NetworkString パラメーターは、インターネット標準のドット区切り 10 進表記を使用した IPv4 サービスを指します。 ネットワーク文字列の一部としてネットワーク ポートが必須です。ネットワーク文字列にプレフィックスが含まれていてはなりません。

ネットワーク文字列の例を次に示します。

192.168.100.10:80

NET_STRING_IPV4_NETWORK
0x00000004
NetworkString パラメーターは、インターネット標準のドット区切り 10 進表記を使用した IPv4 ネットワークを指します。 ネットワーク文字列の一部として、Classless Inter-Domain Routing (CIDR) 表記を使用したネットワーク プレフィックスが必須です。ネットワーク文字列にネットワーク ポートが含まれていてはなりません。

ネットワーク文字列の例を次に示します。

192.168.100/24

NET_STRING_IPV6_ADDRESS
0x00000008
NetworkString パラメーターは、インターネット標準の 16 進エンコードを使用した IPv6 アドレスを指します。 ネットワーク文字列に IPv6 スコープ ID が含まれていてもかまいません。ネットワーク文字列にネットワーク ポートやプレフィックスが含まれていてはなりません。

ネットワーク文字列の例を次に示します。

21DA:00D3:0000:2F3B:02AA:00FF:FE28:9C5A%2

NET_STRING_IPV6_ADDRESS_NO_SCOPE
0x00000008
NetworkString パラメーターは、インターネット標準の 16 進エンコードを使用した IPv6 アドレスを指します。ネットワーク文字列に IPv6 スコープ ID が含まれていてはなりません。ネットワーク文字列にネットワーク ポートやプレフィックスが含まれていてはなりません。

ネットワーク文字列の例を次に示します。

21DA:00D3:0000:2F3B:02AA:00FF:FE28:9C5A

NET_STRING_IPV6_SERVICE
0x00000020
NetworkString パラメーターは、インターネット標準の 16 進エンコードを使用した IPv6 サービスを指します。 ネットワーク文字列の一部としてネットワーク ポートが必須です。ネットワーク文字列に IPv6 スコープ ID が含まれていてもかまいません。ネットワーク文字列にプレフィックスが含まれていてはなりません。

スコープ ID を含むネットワーク文字列の例を次に示します。

[21DA:00D3:0000:2F3B:02AA:00FF:FE28:9C5A%2]:8080

NET_STRING_IPV6_SERVICE_NO_SCOPE
0x00000040
NetworkString パラメーターは、インターネット標準の 16 進エンコードを使用した IPv6 サービスを指します。 ネットワーク文字列の一部としてネットワーク ポートが必須です。ネットワーク文字列に IPv6 スコープ ID が含まれていてはなりません。ネットワーク文字列にプレフィックスが含まれていてはなりません。

ネットワーク文字列の例を次に示します。

21DA:00D3:0000:2F3B:02AA:00FF:FE28:9C5A:8080

NET_STRING_IPV6_NETWORK
0x00000080
NetworkString パラメーターは、インターネット標準の 16 進エンコードを使用した IPv6 ネットワークを指します。 ネットワーク文字列の一部として CIDR 表記のネットワーク プレフィックスが必須です。ネットワーク文字列にネットワーク ポートやスコープ ID が含まれていてはなりません。

ネットワーク文字列の例を次に示します。

21DA:D3::/48

NET_STRING_NAMED_ADDRESS
0x00000100
NetworkString パラメーターは、Domain Name System (DNS) 名を使用したインターネット アドレスを指します。 ネットワーク文字列にネットワーク ポートやプレフィックスが含まれていてはなりません。

ネットワーク文字列の例を次に示します。

www.microsoft.com

NET_STRING_NAMED_SERVICE
0x00000200
NetworkString パラメーターは、DNS 名を使用したインターネット サービスを指します。 ネットワーク文字列にネットワーク ポートが含まれている必要があります。

ネットワーク文字列の例を次に示します。

www.microsoft.com:80

NET_STRING_IP_ADDRESS
0x00000009
NetworkString パラメーターは、インターネット標準のドット区切り 10 進表記を使用した IPv4 アドレス、またはインターネット標準の 16 進エンコードを使用した IPv6 アドレスを指します。 ネットワーク文字列に IPv6 スコープ ID が含まれていてもかまいません。ネットワーク文字列にネットワーク ポートやプレフィックスが含まれていてはなりません。

この型は NET_STRING_IPV4_ADDRESS または NET_STRING_IPV6_ADDRESS のいずれかの型に一致します。

NET_STRING_IP_ADDRESS_NO_SCOPE
0x00000011
NetworkString パラメーターは、インターネット標準のドット区切り 10 進表記を使用した IPv4 アドレス、またはインターネット標準の 16 進エンコードを使用した IPv6 アドレスを指します。 ネットワーク文字列に IPv6 スコープ ID が含まれていてはなりません。ネットワーク文字列にネットワーク ポートやプレフィックスが含まれていてはなりません。

この型は NET_STRING_IPV4_ADDRESS または NET_STRING_IPV6_ADDRESS_NO_SCOPE のいずれかの型に一致します。

NET_STRING_IP_SERVICE
0x00000022
NetworkString パラメーターは、IPv4 サービスまたは IPv6 サービスを指します。 ネットワーク文字列の一部としてネットワーク ポートが必須です。ネットワーク文字列に IPv6 スコープ ID が含まれていてもかまいません。ネットワーク文字列にプレフィックスが含まれていてはなりません。

この型は NET_STRING_IPV4_SERVICE または NET_STRING_IPV6_SERVICE のいずれかの型に一致します。

NET_STRING_IP_SERVICE_NO_SCOPE
0x00000042
NetworkString パラメーターは、IPv4 サービスまたは IPv6 サービスを指します。 ネットワーク文字列の一部としてネットワーク ポートが必須です。ネットワーク文字列に IPv6 スコープ ID が含まれていてはなりません。ネットワーク文字列にプレフィックスが含まれていてはなりません。

この型は NET_STRING_IPV4_SERVICE または NET_STRING_IPV6_SERVICE_NO_SCOPE のいずれかの型に一致します。

NET_STRING_IP_NETWORK
0x00000084
NetworkString パラメーターは、IPv4 ネットワークまたは IPv6 ネットワークを指します。 ネットワーク文字列の一部として CIDR 表記のネットワーク プレフィックスが必須です。ネットワークにネットワーク ポートやスコープ ID が含まれていてはなりません。

この型は NET_STRING_IPV4_NETWORK または NET_STRING_IPV6_NETWORK のいずれかの型に一致します。

NET_STRING_ANY_ADDRESS
0x00000209
NetworkString パラメーターは、インターネット標準のドット区切り 10 進表記の IPv4 アドレス、インターネット標準の 16 進エンコードの IPv6 アドレス、または DNS 名を指します。 IPv6 アドレスの場合、ネットワーク文字列に IPv6 スコープ ID が含まれていてもかまいません。ネットワーク文字列にネットワーク ポートやプレフィックスが含まれていてはなりません。

この型は NET_STRING_NAMED_ADDRESS または NET_STRING_IP_ADDRESS のいずれかの型に一致します。

NET_STRING_ANY_ADDRESS_NO_SCOPE
0x00000211
NetworkString パラメーターは、インターネット標準のドット区切り 10 進表記の IPv4 アドレス、インターネット標準の 16 進エンコードの IPv6 アドレス、または DNS 名を指します。 IPv6 アドレスの場合、ネットワーク文字列に IPv6 スコープ ID が含まれていてはなりません。ネットワーク文字列にネットワーク ポートやプレフィックスが含まれていてはなりません。

この型は NET_STRING_NAMED_ADDRESS または NET_STRING_IP_ADDRESS_NO_SCOPE のいずれかの型に一致します。

NET_STRING_ANY_SERVICE
0x00000222
NetworkString パラメーターは、IP アドレス表記または DNS 名を使用した IPv4 サービスまたは IPv6 サービスを指します。 ネットワーク文字列の一部としてネットワーク ポートが必須です。ネットワーク文字列に IPv6 スコープ ID が含まれていてもかまいません。ネットワーク文字列にプレフィックスが含まれていてはなりません。

この型は NET_STRING_NAMED_SERVICE または NET_STRING_IP_SERVICE のいずれかの型に一致します。

NET_STRING_ANY_SERVICE_NO_SCOPE
0x00000242
NetworkString パラメーターは、IP アドレス表記または DNS 名を使用した IPv4 サービスまたは IPv6 サービスを指します。 ネットワーク文字列の一部としてネットワーク ポートが必須です。ネットワーク文字列に IPv6 スコープ ID が含まれていてはなりません。ネットワーク文字列にプレフィックスが含まれていてはなりません。

この型は NET_STRING_NAMED_SERVICE または NET_STRING_IP_SERVICE_NO_SCOPE のいずれかの型に一致します。

AddressInfoNET_ADDRESS_INFO*outoptional成功した場合、このパラメーターに NULL ポインターが渡されていなければ、関数は解析された IP アドレス情報を含む NET_ADDRESS_INFO 構造体へのポインターを返します。
PortNumberWORD*outoptional成功した場合、このパラメーターに NULL ポインターが渡されていなければ、関数は解析されたネットワーク ポートをホスト順で示すポインターを返します。NetworkString パラメーターにネットワーク ポートが存在しなかった場合は、値 0 へのポインターが返されます。
PrefixLengthBYTE*outoptional成功した場合、このパラメーターに NULL ポインターが渡されていなければ、関数は解析されたプレフィックス長へのポインターを返します。NetworkString パラメーターにプレフィックスが存在しなかった場合は、値 -1 へのポインターが返されます。

戻り値の型: DWORD

公式ドキュメント

入力されたネットワーク文字列を解析し、それが指定された IP ネットワーク文字列型の正当な表現であるかどうかを確認します。文字列が型とその仕様に一致する場合、この関数はオプションで解析結果を返すことができます。

戻り値

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

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

戻り値 説明
ERROR_INSUFFICIENT_BUFFER
関数に渡されたバッファーが小さすぎます。このエラーは、AddressInfo パラメーターが指すバッファーが、解析されたネットワーク アドレスを保持するには小さすぎる場合に返されます。
ERROR_INVALID_PARAMETER
無効なパラメーターが関数に渡されました。このエラーは、NetworkString パラメーターに NULL ポインターが渡された場合に返されます。

解説(Remarks)

ParseNetworkString 関数は、NetworkString パラメーターで渡された入力ネットワーク文字列を解析し、それが Types 引数で指定された文字列型のいずれかの正当な表現であるかどうかを確認します。文字列が型とその仕様に一致する場合、関数は成功し、オプションの AddressInfoPortNumberPrefixLength パラメーターが NULL ポインターでない場合には、これらのパラメーターを通じて解析結果を呼び出し元にオプションで返すことができます。

ParseNetworkString 関数は、IPv4 または IPv6 のアドレス、サービス、ネットワークの表現に加え、DNS 名を使用した名前付きのインターネット アドレスおよびサービスを解析できます。

AddressInfo パラメーターが指す NET_ADDRESS_INFO 構造体。SOCKADDR_IN および SOCKADDR 構造体は Ws2def.h ヘッダー ファイルで定義されており、これは Winsock2.h ヘッダー ファイルによって自動的にインクルードされます。SOCKADDR_IN6 構造体は Ws2ipdef.h ヘッダー ファイルで定義されており、これは Ws2tcpip.h ヘッダー ファイルによって自動的にインクルードされます。ParseNetworkString 関数と NET_ADDRESS_INFO 構造体を使用するには、Winsock2.h および Ws2tcpip.h ヘッダー ファイルを Iphlpapi.h ヘッダー ファイルよりも前にインクルードする必要があります。

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

各言語での呼び出し定義

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

DWORD ParseNetworkString(
    LPCWSTR NetworkString,
    DWORD Types,
    NET_ADDRESS_INFO* AddressInfo,   // optional
    WORD* PortNumber,   // optional
    BYTE* PrefixLength   // optional
);
[DllImport("IPHLPAPI.dll", ExactSpelling = true)]
static extern uint ParseNetworkString(
    [MarshalAs(UnmanagedType.LPWStr)] string NetworkString,   // LPCWSTR
    uint Types,   // DWORD
    IntPtr AddressInfo,   // NET_ADDRESS_INFO* optional, out
    IntPtr PortNumber,   // WORD* optional, out
    IntPtr PrefixLength   // BYTE* optional, out
);
<DllImport("IPHLPAPI.dll", ExactSpelling:=True)>
Public Shared Function ParseNetworkString(
    <MarshalAs(UnmanagedType.LPWStr)> NetworkString As String,   ' LPCWSTR
    Types As UInteger,   ' DWORD
    AddressInfo As IntPtr,   ' NET_ADDRESS_INFO* optional, out
    PortNumber As IntPtr,   ' WORD* optional, out
    PrefixLength As IntPtr   ' BYTE* optional, out
) As UInteger
End Function
' NetworkString : LPCWSTR
' Types : DWORD
' AddressInfo : NET_ADDRESS_INFO* optional, out
' PortNumber : WORD* optional, out
' PrefixLength : BYTE* optional, out
Declare PtrSafe Function ParseNetworkString Lib "iphlpapi" ( _
    ByVal NetworkString As LongPtr, _
    ByVal Types As Long, _
    ByVal AddressInfo As LongPtr, _
    ByVal PortNumber As LongPtr, _
    ByVal PrefixLength As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

ParseNetworkString = ctypes.windll.iphlpapi.ParseNetworkString
ParseNetworkString.restype = wintypes.DWORD
ParseNetworkString.argtypes = [
    wintypes.LPCWSTR,  # NetworkString : LPCWSTR
    wintypes.DWORD,  # Types : DWORD
    ctypes.c_void_p,  # AddressInfo : NET_ADDRESS_INFO* optional, out
    ctypes.POINTER(ctypes.c_ushort),  # PortNumber : WORD* optional, out
    ctypes.POINTER(ctypes.c_ubyte),  # PrefixLength : BYTE* optional, out
]
require 'fiddle'
require 'fiddle/import'

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

var (
	iphlpapi = windows.NewLazySystemDLL("IPHLPAPI.dll")
	procParseNetworkString = iphlpapi.NewProc("ParseNetworkString")
)

// NetworkString (LPCWSTR), Types (DWORD), AddressInfo (NET_ADDRESS_INFO* optional, out), PortNumber (WORD* optional, out), PrefixLength (BYTE* optional, out)
r1, _, err := procParseNetworkString.Call(
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(NetworkString))),
	uintptr(Types),
	uintptr(AddressInfo),
	uintptr(PortNumber),
	uintptr(PrefixLength),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // DWORD
function ParseNetworkString(
  NetworkString: PWideChar;   // LPCWSTR
  Types: DWORD;   // DWORD
  AddressInfo: Pointer;   // NET_ADDRESS_INFO* optional, out
  PortNumber: Pointer;   // WORD* optional, out
  PrefixLength: Pointer   // BYTE* optional, out
): DWORD; stdcall;
  external 'IPHLPAPI.dll' name 'ParseNetworkString';
result := DllCall("IPHLPAPI\ParseNetworkString"
    , "WStr", NetworkString   ; LPCWSTR
    , "UInt", Types   ; DWORD
    , "Ptr", AddressInfo   ; NET_ADDRESS_INFO* optional, out
    , "Ptr", PortNumber   ; WORD* optional, out
    , "Ptr", PrefixLength   ; BYTE* optional, out
    , "UInt")   ; return: DWORD
●ParseNetworkString(NetworkString, Types, AddressInfo, PortNumber, PrefixLength) = DLL("IPHLPAPI.dll", "dword ParseNetworkString(char*, dword, void*, void*, void*)")
# 呼び出し: ParseNetworkString(NetworkString, Types, AddressInfo, PortNumber, PrefixLength)
# NetworkString : LPCWSTR -> "char*"
# Types : DWORD -> "dword"
# AddressInfo : NET_ADDRESS_INFO* optional, out -> "void*"
# PortNumber : WORD* optional, out -> "void*"
# PrefixLength : BYTE* optional, out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "iphlpapi" fn ParseNetworkString(
    NetworkString: [*c]const u16, // LPCWSTR
    Types: u32, // DWORD
    AddressInfo: [*c]NET_ADDRESS_INFO, // NET_ADDRESS_INFO* optional, out
    PortNumber: [*c]u16, // WORD* optional, out
    PrefixLength: [*c]u8 // BYTE* optional, out
) callconv(std.os.windows.WINAPI) u32;
proc ParseNetworkString(
    NetworkString: WideCString,  # LPCWSTR
    Types: uint32,  # DWORD
    AddressInfo: ptr NET_ADDRESS_INFO,  # NET_ADDRESS_INFO* optional, out
    PortNumber: ptr uint16,  # WORD* optional, out
    PrefixLength: ptr uint8  # BYTE* optional, out
): uint32 {.importc: "ParseNetworkString", stdcall, dynlib: "IPHLPAPI.dll".}
pragma(lib, "iphlpapi");
extern(Windows)
uint ParseNetworkString(
    const(wchar)* NetworkString,   // LPCWSTR
    uint Types,   // DWORD
    NET_ADDRESS_INFO* AddressInfo,   // NET_ADDRESS_INFO* optional, out
    ushort* PortNumber,   // WORD* optional, out
    ubyte* PrefixLength   // BYTE* optional, out
);
ccall((:ParseNetworkString, "IPHLPAPI.dll"), stdcall, UInt32,
      (Cwstring, UInt32, Ptr{NET_ADDRESS_INFO}, Ptr{UInt16}, Ptr{UInt8}),
      NetworkString, Types, AddressInfo, PortNumber, PrefixLength)
# NetworkString : LPCWSTR -> Cwstring
# Types : DWORD -> UInt32
# AddressInfo : NET_ADDRESS_INFO* optional, out -> Ptr{NET_ADDRESS_INFO}
# PortNumber : WORD* optional, out -> Ptr{UInt16}
# PrefixLength : BYTE* optional, out -> Ptr{UInt8}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
uint32_t ParseNetworkString(
    const uint16_t* NetworkString,
    uint32_t Types,
    void* AddressInfo,
    uint16_t* PortNumber,
    uint8_t* PrefixLength);
]]
local iphlpapi = ffi.load("iphlpapi")
-- iphlpapi.ParseNetworkString(NetworkString, Types, AddressInfo, PortNumber, PrefixLength)
-- NetworkString : LPCWSTR
-- Types : DWORD
-- AddressInfo : NET_ADDRESS_INFO* optional, out
-- PortNumber : WORD* optional, out
-- PrefixLength : BYTE* optional, out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('IPHLPAPI.dll');
const ParseNetworkString = lib.func('__stdcall', 'ParseNetworkString', 'uint32_t', ['str16', 'uint32_t', 'void *', 'uint16_t *', 'uint8_t *']);
// ParseNetworkString(NetworkString, Types, AddressInfo, PortNumber, PrefixLength)
// NetworkString : LPCWSTR -> 'str16'
// Types : DWORD -> 'uint32_t'
// AddressInfo : NET_ADDRESS_INFO* optional, out -> 'void *'
// PortNumber : WORD* optional, out -> 'uint16_t *'
// PrefixLength : BYTE* optional, out -> 'uint8_t *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("IPHLPAPI.dll", {
  ParseNetworkString: { parameters: ["buffer", "u32", "pointer", "pointer", "pointer"], result: "u32" },
});
// lib.symbols.ParseNetworkString(NetworkString, Types, AddressInfo, PortNumber, PrefixLength)
// NetworkString : LPCWSTR -> "buffer"
// Types : DWORD -> "u32"
// AddressInfo : NET_ADDRESS_INFO* optional, out -> "pointer"
// PortNumber : WORD* optional, out -> "pointer"
// PrefixLength : BYTE* optional, out -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
uint32_t ParseNetworkString(
    const uint16_t* NetworkString,
    uint32_t Types,
    void* AddressInfo,
    uint16_t* PortNumber,
    uint8_t* PrefixLength);
C, "IPHLPAPI.dll");
// $ffi->ParseNetworkString(NetworkString, Types, AddressInfo, PortNumber, PrefixLength);
// NetworkString : LPCWSTR
// Types : DWORD
// AddressInfo : NET_ADDRESS_INFO* optional, out
// PortNumber : WORD* optional, out
// PrefixLength : BYTE* optional, out
// 構造体/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 ParseNetworkString(
        WString NetworkString,   // LPCWSTR
        int Types,   // DWORD
        Pointer AddressInfo,   // NET_ADDRESS_INFO* optional, out
        ShortByReference PortNumber,   // WORD* optional, out
        byte[] PrefixLength   // BYTE* optional, out
    );
}
@[Link("iphlpapi")]
lib LibIPHLPAPI
  fun ParseNetworkString = ParseNetworkString(
    NetworkString : UInt16*,   # LPCWSTR
    Types : UInt32,   # DWORD
    AddressInfo : NET_ADDRESS_INFO*,   # NET_ADDRESS_INFO* optional, out
    PortNumber : UInt16*,   # WORD* optional, out
    PrefixLength : UInt8*   # BYTE* optional, out
  ) : UInt32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef ParseNetworkStringNative = Uint32 Function(Pointer<Utf16>, Uint32, Pointer<Void>, Pointer<Uint16>, Pointer<Uint8>);
typedef ParseNetworkStringDart = int Function(Pointer<Utf16>, int, Pointer<Void>, Pointer<Uint16>, Pointer<Uint8>);
final ParseNetworkString = DynamicLibrary.open('IPHLPAPI.dll')
    .lookupFunction<ParseNetworkStringNative, ParseNetworkStringDart>('ParseNetworkString');
// NetworkString : LPCWSTR -> Pointer<Utf16>
// Types : DWORD -> Uint32
// AddressInfo : NET_ADDRESS_INFO* optional, out -> Pointer<Void>
// PortNumber : WORD* optional, out -> Pointer<Uint16>
// PrefixLength : BYTE* optional, out -> Pointer<Uint8>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function ParseNetworkString(
  NetworkString: PWideChar;   // LPCWSTR
  Types: DWORD;   // DWORD
  AddressInfo: Pointer;   // NET_ADDRESS_INFO* optional, out
  PortNumber: Pointer;   // WORD* optional, out
  PrefixLength: Pointer   // BYTE* optional, out
): DWORD; stdcall;
  external 'IPHLPAPI.dll' name 'ParseNetworkString';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "ParseNetworkString"
  c_ParseNetworkString :: CWString -> Word32 -> Ptr () -> Ptr Word16 -> Ptr Word8 -> IO Word32
-- NetworkString : LPCWSTR -> CWString
-- Types : DWORD -> Word32
-- AddressInfo : NET_ADDRESS_INFO* optional, out -> Ptr ()
-- PortNumber : WORD* optional, out -> Ptr Word16
-- PrefixLength : BYTE* optional, out -> Ptr Word8
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let parsenetworkstring =
  foreign "ParseNetworkString"
    ((ptr uint16_t) @-> uint32_t @-> (ptr void) @-> (ptr uint16_t) @-> (ptr uint8_t) @-> returning uint32_t)
(* NetworkString : LPCWSTR -> (ptr uint16_t) *)
(* Types : DWORD -> uint32_t *)
(* AddressInfo : NET_ADDRESS_INFO* optional, out -> (ptr void) *)
(* PortNumber : WORD* optional, out -> (ptr uint16_t) *)
(* PrefixLength : BYTE* optional, out -> (ptr uint8_t) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library iphlpapi (t "IPHLPAPI.dll"))
(cffi:use-foreign-library iphlpapi)

(cffi:defcfun ("ParseNetworkString" parse-network-string :convention :stdcall) :uint32
  (network-string (:string :encoding :utf-16le))   ; LPCWSTR
  (types :uint32)   ; DWORD
  (address-info :pointer)   ; NET_ADDRESS_INFO* optional, out
  (port-number :pointer)   ; WORD* optional, out
  (prefix-length :pointer))   ; BYTE* optional, out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $ParseNetworkString = Win32::API::More->new('IPHLPAPI',
    'DWORD ParseNetworkString(LPCWSTR NetworkString, DWORD Types, LPVOID AddressInfo, LPVOID PortNumber, LPVOID PrefixLength)');
# my $ret = $ParseNetworkString->Call($NetworkString, $Types, $AddressInfo, $PortNumber, $PrefixLength);
# NetworkString : LPCWSTR -> LPCWSTR
# Types : DWORD -> DWORD
# AddressInfo : NET_ADDRESS_INFO* optional, out -> LPVOID
# PortNumber : WORD* optional, out -> LPVOID
# PrefixLength : BYTE* optional, out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

使用する型