Win32 API 日本語リファレンス
ホームNetworking.WinSock › GetAddressByNameW

GetAddressByNameW

関数
サービス名から対応するアドレス情報を取得する。
DLLMSWSOCK.dll文字セットUnicode (-W)呼出規約winapiSetLastErrorあり対応OSWindows 2000 以降

シグネチャ

// MSWSOCK.dll  (Unicode / -W)
#include <windows.h>

INT GetAddressByNameW(
    DWORD dwNameSpace,
    GUID* lpServiceType,
    LPWSTR lpServiceName,   // optional
    INT* lpiProtocols,   // optional
    DWORD dwResolution,
    SERVICE_ASYNC_INFO* lpServiceAsyncInfo,   // optional
    void* lpCsaddrBuffer,
    DWORD* lpdwBufferLength,
    LPWSTR lpAliasBuffer,   // optional
    DWORD* lpdwAliasBufferLength
);

パラメーター

名前方向説明
dwNameSpaceDWORDin

ネットワークアドレス情報を問い合わせる際に、オペレーティングシステムが照会すべき名前空間、または既定の名前空間のセットです。

名前空間を指定するには、次の定数のいずれかを使用します。

意味
NS_DEFAULT
既定の名前空間のセットです。この関数はこのセット内の各名前空間を照会します。既定の名前空間のセットには、通常、システムにインストールされているすべての名前空間が含まれます。ただし、システム管理者は特定の名前空間をセットから除外できます。ほとんどのアプリケーションは dwNameSpace にこの値を使用すべきです。
NS_DNS
インターネットでホスト名解決に使用される Domain Name System (DNS) です。
NS_NETBT
NetBIOS over TCP/IP 層です。すべてのオペレーティングシステムは、自身のコンピューター名を NetBIOS に登録します。この名前空間は、この登録を使用してコンピューター名を IP アドレスに変換するために使用されます。NS_NETBT は WINS サーバーにアクセスして解決を実行できることに注意してください。
NS_SAP
NetWare Service Advertising Protocol です。必要に応じて NetWare バインダリにアクセスできます。NS_SAP はサービスの登録を可能にする動的な名前空間です。
NS_TCPIP_HOSTS
<systemroot>\system32\drivers\etc\hosts ファイル内の値を検索します。
NS_TCPIP_LOCAL
ローカルの TCP/IP 名前解決メカニズムです。ローカルホスト名との比較を含み、ホストから IP アドレスへのマッピングのキャッシュ内でホスト名と IP アドレスを検索します。

GetAddressByName の呼び出しのほとんどは、特別な値 NS_DEFAULT を使用すべきです。これにより、クライアントはインターネットワーク上でどの名前空間が利用可能かを知らなくても処理を行えます。名前空間へのアクセスはシステム管理者が決定します。名前空間はクライアントが変更を意識することなく追加または削除できます。

lpServiceTypeGUID*in

ネットワークサービスの種類を指定するグローバル一意識別子 (GUID) へのポインターです。Svcguid.h ヘッダーファイルには、いくつかの GUID サービスの種類の定義と、それらを扱うためのマクロが含まれています。

Svcguid.h ヘッダーファイルは、Winsock2.h ヘッダーファイルによって自動的にインクルードされません。

lpServiceNameLPWSTRinoptional

サービス名を一意に表すゼロ終端文字列へのポインターです。例: "MY SNA SERVER"。

lpServiceNameNULL を設定することは、dwResolutionRES_SERVICE を設定することと等価です。この関数は 2 番目のモードで動作し、指定された種類のサービスがバインドすべきローカルアドレスを取得します。関数はそのローカルアドレスを、*lpCsaddrBuffer に格納された CSADDR_INFO 構造体の LocalAddr メンバーに格納します。

dwResolutionRES_SERVICE が設定されている場合、関数は lpServiceName パラメーターを無視します。

dwNameSpaceNS_DNS が設定されている場合、*lpServiceName はホストの名前です。

lpiProtocolsINT*inoptional

プロトコル識別子のゼロ終端配列へのポインターです。関数は、これらのプロトコルを提供する名前空間プロバイダーに名前解決の試行を制限します。これにより、呼び出し元は検索の範囲を限定できます。

lpiProtocolsNULL が設定されている場合、関数は利用可能なすべてのプロトコルに関する情報を取得します。

dwResolutionDWORDin

サービス名解決処理の各側面を指定するビットフラグのセットです。次のビットフラグが定義されています。

意味
RES_SERVICE
設定されている場合、関数は指定された種類のサービスがバインドすべきアドレスを取得します。これは lpServiceName パラメーターに NULL を設定することと等価です。

このフラグがクリアされている場合、通常の名前解決が行われます。

RES_FIND_MULTIPLE
このフラグが設定されている場合、オペレーティングシステムはすべての名前空間でサービスを広範に検索します。適切なすべての名前空間に対してサービス名の解決を要求します。このフラグがクリアされている場合、オペレーティングシステムはサービスアドレスが 1 つ見つかった時点で検索を停止します。
RES_SOFT_SEARCH
このフラグは、名前空間が複数レベルの検索をサポートする場合に有効です。

このフラグが有効かつ設定されている場合、オペレーティングシステムは名前空間の単純で高速な検索を実行します。これは、アプリケーションがサービスについて見つけやすいアドレスを取得するだけでよい場合に有用です。

このフラグが有効かつクリアされている場合、オペレーティングシステムは名前空間のより広範な検索を実行します。

lpServiceAsyncInfoSERVICE_ASYNC_INFO*inoptional将来の使用のために予約されています。NULL を設定する必要があります。
lpCsaddrBuffervoid*out1 つ以上の CSADDR_INFO データ構造体を受け取るバッファーへのポインターです。バッファーに書き込まれる構造体の数は、解決の試行で見つかった情報の量に依存します。多くの場合は 1 つだけですが、複数の構造体が書き込まれることを想定すべきです。
lpdwBufferLengthDWORD*inout

入力時に、lpCsaddrBuffer が指すバッファーのサイズ(バイト単位)を指定する変数へのポインターです。

出力時には、この変数には CSADDR_INFO 構造体の配列を格納するために必要な合計バイト数が格納されます。この値が *lpdwBufferLength の入力値以下で、かつ関数が成功した場合、これは実際にバッファーに格納されたバイト数です。この値が lpdwBufferLength の入力値より大きい場合、バッファーが小さすぎたことを意味し、lpdwBufferLength の出力値は必要な最小バッファーサイズです。

lpAliasBufferLPWSTRinoutoptional

ネットワークサービスのエイリアス情報を受け取るバッファーへのポインターです。

名前空間がエイリアスをサポートしている場合、関数はゼロ終端の名前文字列の配列を lpAliasBuffer が指すバッファーに格納します。リストの末尾には二重のゼロ終端があります。配列の最初の名前はサービスのプライマリ名です。それ以降の名前はエイリアスです。エイリアスをサポートする名前空間の例として DNS があります。

名前空間がエイリアスをサポートしていない場合は、二重のゼロ終端をバッファーに格納します。

このパラメーターは省略可能であり、NULL を設定できます。

lpdwAliasBufferLengthDWORD*inout

入力時に、lpAliasBuffer が指すバッファーのサイズ(要素数、文字数)を指定する変数へのポインターです。

出力時には、この変数には名前文字列の配列を格納するために必要な合計要素数(文字数)が格納されます。この値が *lpdwAliasBufferLength の入力値以下で、かつ関数が成功した場合、これは実際にバッファーに格納された要素数です。この値が lpdwAliasBufferLength の入力値より大きい場合、バッファーが小さすぎたことを意味し、lpdwAliasBufferLength の出力値は必要な最小バッファーサイズです。

lpAliasBufferNULL の場合、lpdwAliasBufferLength は意味を持たず、同様に NULL にできます。

戻り値の型: INT

公式ドキュメント

GetAddressByName は Windows Sockets 2 の時点で使用できなくなりました。(Unicode)

戻り値

関数が成功した場合、戻り値は lpCsaddrBuffer が指すバッファーに書き込まれた CSADDR_INFO データ構造体の数です。

関数が失敗した場合、戻り値は SOCKET_ERROR(-1)です。拡張エラー情報を取得するには GetLastError を呼び出します。次の拡張エラー値が返されます。

エラーコード 意味
ERROR_INSUFFICIENT_BUFFER
lpCsaddrBuffer が指すバッファーが、関連するすべての CSADDR_INFO 構造体を受け取るには小さすぎました。*lpdwBufferLength に返された値以上のサイズのバッファーで関数を呼び出してください。

解説(Remarks)

この関数は gethostbyname 関数のより強力なバージョンです。 GetAddressByName 関数は複数のネームサービスに対応します。

注意 gethostbyname 関数は getaddrinfo 関数の導入により非推奨となりました。Windows Sockets 2 アプリケーションを作成する開発者は、 gethostbyname ではなく getaddrinfo 関数を使用することが強く推奨されます。

GetAddressByName 関数を使用すると、クライアントはネットワークサービスの Windows Sockets アドレスを取得できます。クライアントは、対象とするサービスをサービスの種類とサービス名で指定します。

多くのネームサービスは、サービス名を解決する際にネームサービスプロバイダーが考慮する既定のプレフィックスまたはサフィックスをサポートしています。たとえば DNS 名前空間で、ドメインが "nt.microsoft.com" という名前であり、入力として "ftp millikan" が指定された場合、DNS ソフトウェアは "millikan" の解決には失敗しますが、"millikan.nt.microsoft.com" の解決には成功します。

GetAddressByName 関数は、サービスアドレスを 2 つの方法で検索できることに注意してください。すなわち、特定の名前空間内、または既定の名前空間のセット内です。既定の名前空間を使用すると、管理者は特定の名前空間を、名前で指定された場合にのみサービスアドレスの検索対象とするように指定できます。また、管理者またはネームスペースのセットアッププログラムは、名前空間の検索順序を制御することもできます。

メモ

nspapi.h ヘッダーは GetAddressByName を、UNICODE プリプロセッサ定数の定義に基づいてこの関数の ANSI 版または Unicode 版を自動的に選択するエイリアスとして定義します。エンコーディング中立のエイリアスの使用を、エンコーディング中立でないコードと混在させると、コンパイルエラーまたは実行時エラーを引き起こす不一致が生じる可能性があります。詳細については、関数プロトタイプの規則を参照してください。

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

各言語での呼び出し定義

// MSWSOCK.dll  (Unicode / -W)
#include <windows.h>

INT GetAddressByNameW(
    DWORD dwNameSpace,
    GUID* lpServiceType,
    LPWSTR lpServiceName,   // optional
    INT* lpiProtocols,   // optional
    DWORD dwResolution,
    SERVICE_ASYNC_INFO* lpServiceAsyncInfo,   // optional
    void* lpCsaddrBuffer,
    DWORD* lpdwBufferLength,
    LPWSTR lpAliasBuffer,   // optional
    DWORD* lpdwAliasBufferLength
);
[DllImport("MSWSOCK.dll", CharSet = CharSet.Unicode, SetLastError = true, ExactSpelling = true)]
static extern int GetAddressByNameW(
    uint dwNameSpace,   // DWORD
    ref Guid lpServiceType,   // GUID*
    [MarshalAs(UnmanagedType.LPWStr)] string lpServiceName,   // LPWSTR optional
    IntPtr lpiProtocols,   // INT* optional
    uint dwResolution,   // DWORD
    IntPtr lpServiceAsyncInfo,   // SERVICE_ASYNC_INFO* optional
    IntPtr lpCsaddrBuffer,   // void* out
    ref uint lpdwBufferLength,   // DWORD* in/out
    [MarshalAs(UnmanagedType.LPWStr)] System.Text.StringBuilder lpAliasBuffer,   // LPWSTR optional, in/out
    ref uint lpdwAliasBufferLength   // DWORD* in/out
);
<DllImport("MSWSOCK.dll", CharSet:=CharSet.Unicode, SetLastError:=True, ExactSpelling:=True)>
Public Shared Function GetAddressByNameW(
    dwNameSpace As UInteger,   ' DWORD
    ByRef lpServiceType As Guid,   ' GUID*
    <MarshalAs(UnmanagedType.LPWStr)> lpServiceName As String,   ' LPWSTR optional
    lpiProtocols As IntPtr,   ' INT* optional
    dwResolution As UInteger,   ' DWORD
    lpServiceAsyncInfo As IntPtr,   ' SERVICE_ASYNC_INFO* optional
    lpCsaddrBuffer As IntPtr,   ' void* out
    ByRef lpdwBufferLength As UInteger,   ' DWORD* in/out
    <MarshalAs(UnmanagedType.LPWStr)> lpAliasBuffer As System.Text.StringBuilder,   ' LPWSTR optional, in/out
    ByRef lpdwAliasBufferLength As UInteger   ' DWORD* in/out
) As Integer
End Function
' dwNameSpace : DWORD
' lpServiceType : GUID*
' lpServiceName : LPWSTR optional
' lpiProtocols : INT* optional
' dwResolution : DWORD
' lpServiceAsyncInfo : SERVICE_ASYNC_INFO* optional
' lpCsaddrBuffer : void* out
' lpdwBufferLength : DWORD* in/out
' lpAliasBuffer : LPWSTR optional, in/out
' lpdwAliasBufferLength : DWORD* in/out
Declare PtrSafe Function GetAddressByNameW Lib "mswsock" ( _
    ByVal dwNameSpace As Long, _
    ByVal lpServiceType As LongPtr, _
    ByVal lpServiceName As LongPtr, _
    ByVal lpiProtocols As LongPtr, _
    ByVal dwResolution As Long, _
    ByVal lpServiceAsyncInfo As LongPtr, _
    ByVal lpCsaddrBuffer As LongPtr, _
    ByRef lpdwBufferLength As Long, _
    ByVal lpAliasBuffer As LongPtr, _
    ByRef lpdwAliasBufferLength As Long) As Long
' Unicode(W): 文字列は ByVal As LongPtr とし StrPtr(unicodeStr) を渡す
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

GetAddressByNameW = ctypes.windll.mswsock.GetAddressByNameW
GetAddressByNameW.restype = ctypes.c_int
GetAddressByNameW.argtypes = [
    wintypes.DWORD,  # dwNameSpace : DWORD
    ctypes.c_void_p,  # lpServiceType : GUID*
    wintypes.LPCWSTR,  # lpServiceName : LPWSTR optional
    ctypes.POINTER(ctypes.c_int),  # lpiProtocols : INT* optional
    wintypes.DWORD,  # dwResolution : DWORD
    ctypes.c_void_p,  # lpServiceAsyncInfo : SERVICE_ASYNC_INFO* optional
    ctypes.POINTER(None),  # lpCsaddrBuffer : void* out
    ctypes.POINTER(wintypes.DWORD),  # lpdwBufferLength : DWORD* in/out
    wintypes.LPWSTR,  # lpAliasBuffer : LPWSTR optional, in/out
    ctypes.POINTER(wintypes.DWORD),  # lpdwAliasBufferLength : DWORD* in/out
]
# GetLastError: use ctypes.GetLastError() (or ctypes.WinDLL(use_last_error=True))
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('MSWSOCK.dll')
GetAddressByNameW = Fiddle::Function.new(
  lib['GetAddressByNameW'],
  [
    -Fiddle::TYPE_INT,  # dwNameSpace : DWORD
    Fiddle::TYPE_VOIDP,  # lpServiceType : GUID*
    Fiddle::TYPE_VOIDP,  # lpServiceName : LPWSTR optional
    Fiddle::TYPE_VOIDP,  # lpiProtocols : INT* optional
    -Fiddle::TYPE_INT,  # dwResolution : DWORD
    Fiddle::TYPE_VOIDP,  # lpServiceAsyncInfo : SERVICE_ASYNC_INFO* optional
    Fiddle::TYPE_VOIDP,  # lpCsaddrBuffer : void* out
    Fiddle::TYPE_VOIDP,  # lpdwBufferLength : DWORD* in/out
    Fiddle::TYPE_VOIDP,  # lpAliasBuffer : LPWSTR optional, in/out
    Fiddle::TYPE_VOIDP,  # lpdwAliasBufferLength : DWORD* in/out
  ],
  Fiddle::TYPE_INT)
# Wide strings: pass str.encode("UTF-16LE") + "\x00\x00"
#[link(name = "mswsock")]
extern "system" {
    fn GetAddressByNameW(
        dwNameSpace: u32,  // DWORD
        lpServiceType: *mut GUID,  // GUID*
        lpServiceName: *mut u16,  // LPWSTR optional
        lpiProtocols: *mut i32,  // INT* optional
        dwResolution: u32,  // DWORD
        lpServiceAsyncInfo: *mut SERVICE_ASYNC_INFO,  // SERVICE_ASYNC_INFO* optional
        lpCsaddrBuffer: *mut (),  // void* out
        lpdwBufferLength: *mut u32,  // DWORD* in/out
        lpAliasBuffer: *mut u16,  // LPWSTR optional, in/out
        lpdwAliasBufferLength: *mut u32  // DWORD* in/out
    ) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("MSWSOCK.dll", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern int GetAddressByNameW(uint dwNameSpace, ref Guid lpServiceType, [MarshalAs(UnmanagedType.LPWStr)] string lpServiceName, IntPtr lpiProtocols, uint dwResolution, IntPtr lpServiceAsyncInfo, IntPtr lpCsaddrBuffer, ref uint lpdwBufferLength, [MarshalAs(UnmanagedType.LPWStr)] System.Text.StringBuilder lpAliasBuffer, ref uint lpdwAliasBufferLength);
"@
$api = Add-Type -MemberDefinition $sig -Name 'MSWSOCK_GetAddressByNameW' -Namespace Win32 -PassThru
# $api::GetAddressByNameW(dwNameSpace, lpServiceType, lpServiceName, lpiProtocols, dwResolution, lpServiceAsyncInfo, lpCsaddrBuffer, lpdwBufferLength, lpAliasBuffer, lpdwAliasBufferLength)
#uselib "MSWSOCK.dll"
#func global GetAddressByNameW "GetAddressByNameW" wptr, wptr, wptr, wptr, wptr, wptr, wptr, wptr, wptr, wptr
; GetAddressByNameW dwNameSpace, varptr(lpServiceType), lpServiceName, varptr(lpiProtocols), dwResolution, varptr(lpServiceAsyncInfo), lpCsaddrBuffer, varptr(lpdwBufferLength), varptr(lpAliasBuffer), varptr(lpdwAliasBufferLength)   ; 戻り値は stat
; dwNameSpace : DWORD -> "wptr"
; lpServiceType : GUID* -> "wptr"
; lpServiceName : LPWSTR optional -> "wptr"
; lpiProtocols : INT* optional -> "wptr"
; dwResolution : DWORD -> "wptr"
; lpServiceAsyncInfo : SERVICE_ASYNC_INFO* optional -> "wptr"
; lpCsaddrBuffer : void* out -> "wptr"
; lpdwBufferLength : DWORD* in/out -> "wptr"
; lpAliasBuffer : LPWSTR optional, in/out -> "wptr"
; lpdwAliasBufferLength : DWORD* in/out -> "wptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "MSWSOCK.dll"
#cfunc global GetAddressByNameW "GetAddressByNameW" int, var, wstr, var, int, var, sptr, var, var, var
; res = GetAddressByNameW(dwNameSpace, lpServiceType, lpServiceName, lpiProtocols, dwResolution, lpServiceAsyncInfo, lpCsaddrBuffer, lpdwBufferLength, lpAliasBuffer, lpdwAliasBufferLength)
; dwNameSpace : DWORD -> "int"
; lpServiceType : GUID* -> "var"
; lpServiceName : LPWSTR optional -> "wstr"
; lpiProtocols : INT* optional -> "var"
; dwResolution : DWORD -> "int"
; lpServiceAsyncInfo : SERVICE_ASYNC_INFO* optional -> "var"
; lpCsaddrBuffer : void* out -> "sptr"
; lpdwBufferLength : DWORD* in/out -> "var"
; lpAliasBuffer : LPWSTR optional, in/out -> "var"
; lpdwAliasBufferLength : DWORD* in/out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; INT GetAddressByNameW(DWORD dwNameSpace, GUID* lpServiceType, LPWSTR lpServiceName, INT* lpiProtocols, DWORD dwResolution, SERVICE_ASYNC_INFO* lpServiceAsyncInfo, void* lpCsaddrBuffer, DWORD* lpdwBufferLength, LPWSTR lpAliasBuffer, DWORD* lpdwAliasBufferLength)
#uselib "MSWSOCK.dll"
#cfunc global GetAddressByNameW "GetAddressByNameW" int, var, wstr, var, int, var, intptr, var, var, var
; res = GetAddressByNameW(dwNameSpace, lpServiceType, lpServiceName, lpiProtocols, dwResolution, lpServiceAsyncInfo, lpCsaddrBuffer, lpdwBufferLength, lpAliasBuffer, lpdwAliasBufferLength)
; dwNameSpace : DWORD -> "int"
; lpServiceType : GUID* -> "var"
; lpServiceName : LPWSTR optional -> "wstr"
; lpiProtocols : INT* optional -> "var"
; dwResolution : DWORD -> "int"
; lpServiceAsyncInfo : SERVICE_ASYNC_INFO* optional -> "var"
; lpCsaddrBuffer : void* out -> "intptr"
; lpdwBufferLength : DWORD* in/out -> "var"
; lpAliasBuffer : LPWSTR optional, in/out -> "var"
; lpdwAliasBufferLength : DWORD* in/out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	mswsock = windows.NewLazySystemDLL("MSWSOCK.dll")
	procGetAddressByNameW = mswsock.NewProc("GetAddressByNameW")
)

// dwNameSpace (DWORD), lpServiceType (GUID*), lpServiceName (LPWSTR optional), lpiProtocols (INT* optional), dwResolution (DWORD), lpServiceAsyncInfo (SERVICE_ASYNC_INFO* optional), lpCsaddrBuffer (void* out), lpdwBufferLength (DWORD* in/out), lpAliasBuffer (LPWSTR optional, in/out), lpdwAliasBufferLength (DWORD* in/out)
r1, _, err := procGetAddressByNameW.Call(
	uintptr(dwNameSpace),
	uintptr(lpServiceType),
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(lpServiceName))),
	uintptr(lpiProtocols),
	uintptr(dwResolution),
	uintptr(lpServiceAsyncInfo),
	uintptr(lpCsaddrBuffer),
	uintptr(lpdwBufferLength),
	uintptr(lpAliasBuffer),
	uintptr(lpdwAliasBufferLength),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // INT
function GetAddressByNameW(
  dwNameSpace: DWORD;   // DWORD
  lpServiceType: PGUID;   // GUID*
  lpServiceName: PWideChar;   // LPWSTR optional
  lpiProtocols: Pointer;   // INT* optional
  dwResolution: DWORD;   // DWORD
  lpServiceAsyncInfo: Pointer;   // SERVICE_ASYNC_INFO* optional
  lpCsaddrBuffer: Pointer;   // void* out
  lpdwBufferLength: Pointer;   // DWORD* in/out
  lpAliasBuffer: PWideChar;   // LPWSTR optional, in/out
  lpdwAliasBufferLength: Pointer   // DWORD* in/out
): Integer; stdcall;
  external 'MSWSOCK.dll' name 'GetAddressByNameW';
result := DllCall("MSWSOCK\GetAddressByNameW"
    , "UInt", dwNameSpace   ; DWORD
    , "Ptr", lpServiceType   ; GUID*
    , "WStr", lpServiceName   ; LPWSTR optional
    , "Ptr", lpiProtocols   ; INT* optional
    , "UInt", dwResolution   ; DWORD
    , "Ptr", lpServiceAsyncInfo   ; SERVICE_ASYNC_INFO* optional
    , "Ptr", lpCsaddrBuffer   ; void* out
    , "Ptr", lpdwBufferLength   ; DWORD* in/out
    , "Ptr", lpAliasBuffer   ; LPWSTR optional, in/out
    , "Ptr", lpdwAliasBufferLength   ; DWORD* in/out
    , "Int")   ; return: INT
●GetAddressByNameW(dwNameSpace, lpServiceType, lpServiceName, lpiProtocols, dwResolution, lpServiceAsyncInfo, lpCsaddrBuffer, lpdwBufferLength, lpAliasBuffer, lpdwAliasBufferLength) = DLL("MSWSOCK.dll", "int GetAddressByNameW(dword, void*, char*, void*, dword, void*, void*, void*, char*, void*)")
# 呼び出し: GetAddressByNameW(dwNameSpace, lpServiceType, lpServiceName, lpiProtocols, dwResolution, lpServiceAsyncInfo, lpCsaddrBuffer, lpdwBufferLength, lpAliasBuffer, lpdwAliasBufferLength)
# dwNameSpace : DWORD -> "dword"
# lpServiceType : GUID* -> "void*"
# lpServiceName : LPWSTR optional -> "char*"
# lpiProtocols : INT* optional -> "void*"
# dwResolution : DWORD -> "dword"
# lpServiceAsyncInfo : SERVICE_ASYNC_INFO* optional -> "void*"
# lpCsaddrBuffer : void* out -> "void*"
# lpdwBufferLength : DWORD* in/out -> "void*"
# lpAliasBuffer : LPWSTR optional, in/out -> "char*"
# lpdwAliasBufferLength : DWORD* in/out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
# ※-W(Unicode)関数。なでしこ1はANSIのため -A 版の利用を推奨。
const std = @import("std");

extern "mswsock" fn GetAddressByNameW(
    dwNameSpace: u32, // DWORD
    lpServiceType: [*c]GUID, // GUID*
    lpServiceName: [*c]const u16, // LPWSTR optional
    lpiProtocols: [*c]i32, // INT* optional
    dwResolution: u32, // DWORD
    lpServiceAsyncInfo: [*c]SERVICE_ASYNC_INFO, // SERVICE_ASYNC_INFO* optional
    lpCsaddrBuffer: ?*anyopaque, // void* out
    lpdwBufferLength: [*c]u32, // DWORD* in/out
    lpAliasBuffer: [*c]u16, // LPWSTR optional, in/out
    lpdwAliasBufferLength: [*c]u32 // DWORD* in/out
) callconv(std.os.windows.WINAPI) i32;
// Unicode(-W): UTF-16LE のヌル終端バッファ([*c]const u16)を渡す。
proc GetAddressByNameW(
    dwNameSpace: uint32,  # DWORD
    lpServiceType: ptr GUID,  # GUID*
    lpServiceName: WideCString,  # LPWSTR optional
    lpiProtocols: ptr int32,  # INT* optional
    dwResolution: uint32,  # DWORD
    lpServiceAsyncInfo: ptr SERVICE_ASYNC_INFO,  # SERVICE_ASYNC_INFO* optional
    lpCsaddrBuffer: pointer,  # void* out
    lpdwBufferLength: ptr uint32,  # DWORD* in/out
    lpAliasBuffer: ptr uint16,  # LPWSTR optional, in/out
    lpdwAliasBufferLength: ptr uint32  # DWORD* in/out
): int32 {.importc: "GetAddressByNameW", stdcall, dynlib: "MSWSOCK.dll".}
# Unicode(-W): WideCString は newWideCString("...") で生成。
pragma(lib, "mswsock");
extern(Windows)
int GetAddressByNameW(
    uint dwNameSpace,   // DWORD
    GUID* lpServiceType,   // GUID*
    const(wchar)* lpServiceName,   // LPWSTR optional
    int* lpiProtocols,   // INT* optional
    uint dwResolution,   // DWORD
    SERVICE_ASYNC_INFO* lpServiceAsyncInfo,   // SERVICE_ASYNC_INFO* optional
    void* lpCsaddrBuffer,   // void* out
    uint* lpdwBufferLength,   // DWORD* in/out
    wchar* lpAliasBuffer,   // LPWSTR optional, in/out
    uint* lpdwAliasBufferLength   // DWORD* in/out
);
ccall((:GetAddressByNameW, "MSWSOCK.dll"), stdcall, Int32,
      (UInt32, Ptr{GUID}, Cwstring, Ptr{Int32}, UInt32, Ptr{SERVICE_ASYNC_INFO}, Ptr{Cvoid}, Ptr{UInt32}, Ptr{UInt16}, Ptr{UInt32}),
      dwNameSpace, lpServiceType, lpServiceName, lpiProtocols, dwResolution, lpServiceAsyncInfo, lpCsaddrBuffer, lpdwBufferLength, lpAliasBuffer, lpdwAliasBufferLength)
# dwNameSpace : DWORD -> UInt32
# lpServiceType : GUID* -> Ptr{GUID}
# lpServiceName : LPWSTR optional -> Cwstring
# lpiProtocols : INT* optional -> Ptr{Int32}
# dwResolution : DWORD -> UInt32
# lpServiceAsyncInfo : SERVICE_ASYNC_INFO* optional -> Ptr{SERVICE_ASYNC_INFO}
# lpCsaddrBuffer : void* out -> Ptr{Cvoid}
# lpdwBufferLength : DWORD* in/out -> Ptr{UInt32}
# lpAliasBuffer : LPWSTR optional, in/out -> Ptr{UInt16}
# lpdwAliasBufferLength : DWORD* in/out -> Ptr{UInt32}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
# Unicode(-W): Cwstring には transcode(UInt16, "...") 等で UTF-16 を渡す。
local ffi = require("ffi")
ffi.cdef[[
int32_t GetAddressByNameW(
    uint32_t dwNameSpace,
    void* lpServiceType,
    const uint16_t* lpServiceName,
    int32_t* lpiProtocols,
    uint32_t dwResolution,
    void* lpServiceAsyncInfo,
    void* lpCsaddrBuffer,
    uint32_t* lpdwBufferLength,
    uint16_t* lpAliasBuffer,
    uint32_t* lpdwAliasBufferLength);
]]
local mswsock = ffi.load("mswsock")
-- mswsock.GetAddressByNameW(dwNameSpace, lpServiceType, lpServiceName, lpiProtocols, dwResolution, lpServiceAsyncInfo, lpCsaddrBuffer, lpdwBufferLength, lpAliasBuffer, lpdwAliasBufferLength)
-- dwNameSpace : DWORD
-- lpServiceType : GUID*
-- lpServiceName : LPWSTR optional
-- lpiProtocols : INT* optional
-- dwResolution : DWORD
-- lpServiceAsyncInfo : SERVICE_ASYNC_INFO* optional
-- lpCsaddrBuffer : void* out
-- lpdwBufferLength : DWORD* in/out
-- lpAliasBuffer : LPWSTR optional, in/out
-- lpdwAliasBufferLength : DWORD* in/out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
-- Unicode(-W): uint16_t* には UTF-16LE のバッファ(ffi.new("uint16_t[?]", ...))を渡す。
const koffi = require('koffi');
const lib = koffi.load('MSWSOCK.dll');
const GetAddressByNameW = lib.func('__stdcall', 'GetAddressByNameW', 'int32_t', ['uint32_t', 'void *', 'str16', 'int32_t *', 'uint32_t', 'void *', 'void *', 'uint32_t *', 'uint16_t *', 'uint32_t *']);
// GetAddressByNameW(dwNameSpace, lpServiceType, lpServiceName, lpiProtocols, dwResolution, lpServiceAsyncInfo, lpCsaddrBuffer, lpdwBufferLength, lpAliasBuffer, lpdwAliasBufferLength)
// dwNameSpace : DWORD -> 'uint32_t'
// lpServiceType : GUID* -> 'void *'
// lpServiceName : LPWSTR optional -> 'str16'
// lpiProtocols : INT* optional -> 'int32_t *'
// dwResolution : DWORD -> 'uint32_t'
// lpServiceAsyncInfo : SERVICE_ASYNC_INFO* optional -> 'void *'
// lpCsaddrBuffer : void* out -> 'void *'
// lpdwBufferLength : DWORD* in/out -> 'uint32_t *'
// lpAliasBuffer : LPWSTR optional, in/out -> 'uint16_t *'
// lpdwAliasBufferLength : DWORD* in/out -> 'uint32_t *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("MSWSOCK.dll", {
  GetAddressByNameW: { parameters: ["u32", "pointer", "buffer", "pointer", "u32", "pointer", "pointer", "pointer", "buffer", "pointer"], result: "i32" },
});
// lib.symbols.GetAddressByNameW(dwNameSpace, lpServiceType, lpServiceName, lpiProtocols, dwResolution, lpServiceAsyncInfo, lpCsaddrBuffer, lpdwBufferLength, lpAliasBuffer, lpdwAliasBufferLength)
// dwNameSpace : DWORD -> "u32"
// lpServiceType : GUID* -> "pointer"
// lpServiceName : LPWSTR optional -> "buffer"
// lpiProtocols : INT* optional -> "pointer"
// dwResolution : DWORD -> "u32"
// lpServiceAsyncInfo : SERVICE_ASYNC_INFO* optional -> "pointer"
// lpCsaddrBuffer : void* out -> "pointer"
// lpdwBufferLength : DWORD* in/out -> "pointer"
// lpAliasBuffer : LPWSTR optional, in/out -> "buffer"
// lpdwAliasBufferLength : DWORD* in/out -> "pointer"
// 文字列は "buffer"。Unicode(-W) は new TextEncoder() ではなく UTF-16LE のバイト列(末尾に \x00\x00)を Uint8Array で渡す。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
int32_t GetAddressByNameW(
    uint32_t dwNameSpace,
    void* lpServiceType,
    const uint16_t* lpServiceName,
    int32_t* lpiProtocols,
    uint32_t dwResolution,
    void* lpServiceAsyncInfo,
    void* lpCsaddrBuffer,
    uint32_t* lpdwBufferLength,
    uint16_t* lpAliasBuffer,
    uint32_t* lpdwAliasBufferLength);
C, "MSWSOCK.dll");
// $ffi->GetAddressByNameW(dwNameSpace, lpServiceType, lpServiceName, lpiProtocols, dwResolution, lpServiceAsyncInfo, lpCsaddrBuffer, lpdwBufferLength, lpAliasBuffer, lpdwAliasBufferLength);
// dwNameSpace : DWORD
// lpServiceType : GUID*
// lpServiceName : LPWSTR optional
// lpiProtocols : INT* optional
// dwResolution : DWORD
// lpServiceAsyncInfo : SERVICE_ASYNC_INFO* optional
// lpCsaddrBuffer : void* out
// lpdwBufferLength : DWORD* in/out
// lpAliasBuffer : LPWSTR optional, in/out
// lpdwAliasBufferLength : DWORD* in/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 Mswsock extends StdCallLibrary {
    Mswsock INSTANCE = Native.load("mswsock", Mswsock.class, W32APIOptions.UNICODE_OPTIONS);
    int GetAddressByNameW(
        int dwNameSpace,   // DWORD
        Pointer lpServiceType,   // GUID*
        WString lpServiceName,   // LPWSTR optional
        IntByReference lpiProtocols,   // INT* optional
        int dwResolution,   // DWORD
        Pointer lpServiceAsyncInfo,   // SERVICE_ASYNC_INFO* optional
        Pointer lpCsaddrBuffer,   // void* out
        IntByReference lpdwBufferLength,   // DWORD* in/out
        char[] lpAliasBuffer,   // LPWSTR optional, in/out
        IntByReference lpdwAliasBufferLength   // DWORD* in/out
    );
}
// Unicode(-W): WString(入力)/char[](出力)で UTF-16 をマーシャリング。
@[Link("mswsock")]
lib LibMSWSOCK
  fun GetAddressByNameW = GetAddressByNameW(
    dwNameSpace : UInt32,   # DWORD
    lpServiceType : GUID*,   # GUID*
    lpServiceName : UInt16*,   # LPWSTR optional
    lpiProtocols : Int32*,   # INT* optional
    dwResolution : UInt32,   # DWORD
    lpServiceAsyncInfo : SERVICE_ASYNC_INFO*,   # SERVICE_ASYNC_INFO* optional
    lpCsaddrBuffer : Void*,   # void* out
    lpdwBufferLength : UInt32*,   # DWORD* in/out
    lpAliasBuffer : UInt16*,   # LPWSTR optional, in/out
    lpdwAliasBufferLength : UInt32*   # DWORD* in/out
  ) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef GetAddressByNameWNative = Int32 Function(Uint32, Pointer<Void>, Pointer<Utf16>, Pointer<Int32>, Uint32, Pointer<Void>, Pointer<Void>, Pointer<Uint32>, Pointer<Utf16>, Pointer<Uint32>);
typedef GetAddressByNameWDart = int Function(int, Pointer<Void>, Pointer<Utf16>, Pointer<Int32>, int, Pointer<Void>, Pointer<Void>, Pointer<Uint32>, Pointer<Utf16>, Pointer<Uint32>);
final GetAddressByNameW = DynamicLibrary.open('MSWSOCK.dll')
    .lookupFunction<GetAddressByNameWNative, GetAddressByNameWDart>('GetAddressByNameW');
// dwNameSpace : DWORD -> Uint32
// lpServiceType : GUID* -> Pointer<Void>
// lpServiceName : LPWSTR optional -> Pointer<Utf16>
// lpiProtocols : INT* optional -> Pointer<Int32>
// dwResolution : DWORD -> Uint32
// lpServiceAsyncInfo : SERVICE_ASYNC_INFO* optional -> Pointer<Void>
// lpCsaddrBuffer : void* out -> Pointer<Void>
// lpdwBufferLength : DWORD* in/out -> Pointer<Uint32>
// lpAliasBuffer : LPWSTR optional, in/out -> Pointer<Utf16>
// lpdwAliasBufferLength : DWORD* in/out -> Pointer<Uint32>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function GetAddressByNameW(
  dwNameSpace: DWORD;   // DWORD
  lpServiceType: PGUID;   // GUID*
  lpServiceName: PWideChar;   // LPWSTR optional
  lpiProtocols: Pointer;   // INT* optional
  dwResolution: DWORD;   // DWORD
  lpServiceAsyncInfo: Pointer;   // SERVICE_ASYNC_INFO* optional
  lpCsaddrBuffer: Pointer;   // void* out
  lpdwBufferLength: Pointer;   // DWORD* in/out
  lpAliasBuffer: PWideChar;   // LPWSTR optional, in/out
  lpdwAliasBufferLength: Pointer   // DWORD* in/out
): Integer; stdcall;
  external 'MSWSOCK.dll' name 'GetAddressByNameW';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "GetAddressByNameW"
  c_GetAddressByNameW :: Word32 -> Ptr () -> CWString -> Ptr Int32 -> Word32 -> Ptr () -> Ptr () -> Ptr Word32 -> CWString -> Ptr Word32 -> IO Int32
-- dwNameSpace : DWORD -> Word32
-- lpServiceType : GUID* -> Ptr ()
-- lpServiceName : LPWSTR optional -> CWString
-- lpiProtocols : INT* optional -> Ptr Int32
-- dwResolution : DWORD -> Word32
-- lpServiceAsyncInfo : SERVICE_ASYNC_INFO* optional -> Ptr ()
-- lpCsaddrBuffer : void* out -> Ptr ()
-- lpdwBufferLength : DWORD* in/out -> Ptr Word32
-- lpAliasBuffer : LPWSTR optional, in/out -> CWString
-- lpdwAliasBufferLength : DWORD* in/out -> Ptr Word32
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let getaddressbynamew =
  foreign "GetAddressByNameW"
    (uint32_t @-> (ptr void) @-> (ptr uint16_t) @-> (ptr int32_t) @-> uint32_t @-> (ptr void) @-> (ptr void) @-> (ptr uint32_t) @-> (ptr uint16_t) @-> (ptr uint32_t) @-> returning int32_t)
(* dwNameSpace : DWORD -> uint32_t *)
(* lpServiceType : GUID* -> (ptr void) *)
(* lpServiceName : LPWSTR optional -> (ptr uint16_t) *)
(* lpiProtocols : INT* optional -> (ptr int32_t) *)
(* dwResolution : DWORD -> uint32_t *)
(* lpServiceAsyncInfo : SERVICE_ASYNC_INFO* optional -> (ptr void) *)
(* lpCsaddrBuffer : void* out -> (ptr void) *)
(* lpdwBufferLength : DWORD* in/out -> (ptr uint32_t) *)
(* lpAliasBuffer : LPWSTR optional, in/out -> (ptr uint16_t) *)
(* lpdwAliasBufferLength : DWORD* in/out -> (ptr uint32_t) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library mswsock (t "MSWSOCK.dll"))
(cffi:use-foreign-library mswsock)

(cffi:defcfun ("GetAddressByNameW" get-address-by-name-w :convention :stdcall) :int32
  (dw-name-space :uint32)   ; DWORD
  (lp-service-type :pointer)   ; GUID*
  (lp-service-name (:string :encoding :utf-16le))   ; LPWSTR optional
  (lpi-protocols :pointer)   ; INT* optional
  (dw-resolution :uint32)   ; DWORD
  (lp-service-async-info :pointer)   ; SERVICE_ASYNC_INFO* optional
  (lp-csaddr-buffer :pointer)   ; void* out
  (lpdw-buffer-length :pointer)   ; DWORD* in/out
  (lp-alias-buffer :pointer)   ; LPWSTR optional, in/out
  (lpdw-alias-buffer-length :pointer))   ; DWORD* in/out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $GetAddressByNameW = Win32::API::More->new('MSWSOCK',
    'int GetAddressByNameW(DWORD dwNameSpace, LPVOID lpServiceType, LPCWSTR lpServiceName, LPVOID lpiProtocols, DWORD dwResolution, LPVOID lpServiceAsyncInfo, LPVOID lpCsaddrBuffer, LPVOID lpdwBufferLength, LPWSTR lpAliasBuffer, LPVOID lpdwAliasBufferLength)');
# my $ret = $GetAddressByNameW->Call($dwNameSpace, $lpServiceType, $lpServiceName, $lpiProtocols, $dwResolution, $lpServiceAsyncInfo, $lpCsaddrBuffer, $lpdwBufferLength, $lpAliasBuffer, $lpdwAliasBufferLength);
# dwNameSpace : DWORD -> DWORD
# lpServiceType : GUID* -> LPVOID
# lpServiceName : LPWSTR optional -> LPCWSTR
# lpiProtocols : INT* optional -> LPVOID
# dwResolution : DWORD -> DWORD
# lpServiceAsyncInfo : SERVICE_ASYNC_INFO* optional -> LPVOID
# lpCsaddrBuffer : void* out -> LPVOID
# lpdwBufferLength : DWORD* in/out -> LPVOID
# lpAliasBuffer : LPWSTR optional, in/out -> LPWSTR
# lpdwAliasBufferLength : DWORD* in/out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。
# Unicode(-W): LPCWSTR/LPWSTR は Win32::API が UTF-16 変換を行う。

関連項目

文字セット違い
公式の関連項目
使用する型