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

GetAddressByNameA

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

シグネチャ

// MSWSOCK.dll  (ANSI / -A)
#include <windows.h>

INT GetAddressByNameA(
    DWORD dwNameSpace,
    GUID* lpServiceType,
    LPSTR lpServiceName,   // optional
    INT* lpiProtocols,   // optional
    DWORD dwResolution,
    SERVICE_ASYNC_INFO* lpServiceAsyncInfo,   // optional
    void* lpCsaddrBuffer,
    DWORD* lpdwBufferLength,
    LPSTR 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 ヘッダーファイルによって自動的にインクルードされません。

lpServiceNameLPSTRinoptional

サービス名を一意に表すゼロ終端文字列へのポインターです。たとえば "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 の出力値は必要な最小バッファーサイズとなります。

lpAliasBufferLPSTRinoutoptional

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

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

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

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

lpdwAliasBufferLengthDWORD*inout

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

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

lpAliasBufferNULL の場合、lpdwAliasBufferLength は意味を持たず、NULL にすることもできます。

戻り値の型: INT

公式ドキュメント

GetAddressByName は Windows Sockets 2 以降では使用できません。(ANSI)

戻り値

関数が成功した場合、戻り値は 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  (ANSI / -A)
#include <windows.h>

INT GetAddressByNameA(
    DWORD dwNameSpace,
    GUID* lpServiceType,
    LPSTR lpServiceName,   // optional
    INT* lpiProtocols,   // optional
    DWORD dwResolution,
    SERVICE_ASYNC_INFO* lpServiceAsyncInfo,   // optional
    void* lpCsaddrBuffer,
    DWORD* lpdwBufferLength,
    LPSTR lpAliasBuffer,   // optional
    DWORD* lpdwAliasBufferLength
);
[DllImport("MSWSOCK.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
static extern int GetAddressByNameA(
    uint dwNameSpace,   // DWORD
    ref Guid lpServiceType,   // GUID*
    [MarshalAs(UnmanagedType.LPStr)] string lpServiceName,   // LPSTR 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.LPStr)] System.Text.StringBuilder lpAliasBuffer,   // LPSTR optional, in/out
    ref uint lpdwAliasBufferLength   // DWORD* in/out
);
<DllImport("MSWSOCK.dll", CharSet:=CharSet.Ansi, SetLastError:=True, ExactSpelling:=True)>
Public Shared Function GetAddressByNameA(
    dwNameSpace As UInteger,   ' DWORD
    ByRef lpServiceType As Guid,   ' GUID*
    <MarshalAs(UnmanagedType.LPStr)> lpServiceName As String,   ' LPSTR 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.LPStr)> lpAliasBuffer As System.Text.StringBuilder,   ' LPSTR optional, in/out
    ByRef lpdwAliasBufferLength As UInteger   ' DWORD* in/out
) As Integer
End Function
' dwNameSpace : DWORD
' lpServiceType : GUID*
' lpServiceName : LPSTR optional
' lpiProtocols : INT* optional
' dwResolution : DWORD
' lpServiceAsyncInfo : SERVICE_ASYNC_INFO* optional
' lpCsaddrBuffer : void* out
' lpdwBufferLength : DWORD* in/out
' lpAliasBuffer : LPSTR optional, in/out
' lpdwAliasBufferLength : DWORD* in/out
Declare PtrSafe Function GetAddressByNameA Lib "mswsock" ( _
    ByVal dwNameSpace As Long, _
    ByVal lpServiceType As LongPtr, _
    ByVal lpServiceName As String, _
    ByVal lpiProtocols As LongPtr, _
    ByVal dwResolution As Long, _
    ByVal lpServiceAsyncInfo As LongPtr, _
    ByVal lpCsaddrBuffer As LongPtr, _
    ByRef lpdwBufferLength As Long, _
    ByVal lpAliasBuffer As String, _
    ByRef lpdwAliasBufferLength As Long) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

GetAddressByNameA = ctypes.windll.mswsock.GetAddressByNameA
GetAddressByNameA.restype = ctypes.c_int
GetAddressByNameA.argtypes = [
    wintypes.DWORD,  # dwNameSpace : DWORD
    ctypes.c_void_p,  # lpServiceType : GUID*
    wintypes.LPCSTR,  # lpServiceName : LPSTR 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.LPSTR,  # lpAliasBuffer : LPSTR 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')
GetAddressByNameA = Fiddle::Function.new(
  lib['GetAddressByNameA'],
  [
    -Fiddle::TYPE_INT,  # dwNameSpace : DWORD
    Fiddle::TYPE_VOIDP,  # lpServiceType : GUID*
    Fiddle::TYPE_VOIDP,  # lpServiceName : LPSTR 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 : LPSTR optional, in/out
    Fiddle::TYPE_VOIDP,  # lpdwAliasBufferLength : DWORD* in/out
  ],
  Fiddle::TYPE_INT)
#[link(name = "mswsock")]
extern "system" {
    fn GetAddressByNameA(
        dwNameSpace: u32,  // DWORD
        lpServiceType: *mut GUID,  // GUID*
        lpServiceName: *mut u8,  // LPSTR 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 u8,  // LPSTR 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.Ansi, SetLastError = true)]
public static extern int GetAddressByNameA(uint dwNameSpace, ref Guid lpServiceType, [MarshalAs(UnmanagedType.LPStr)] string lpServiceName, IntPtr lpiProtocols, uint dwResolution, IntPtr lpServiceAsyncInfo, IntPtr lpCsaddrBuffer, ref uint lpdwBufferLength, [MarshalAs(UnmanagedType.LPStr)] System.Text.StringBuilder lpAliasBuffer, ref uint lpdwAliasBufferLength);
"@
$api = Add-Type -MemberDefinition $sig -Name 'MSWSOCK_GetAddressByNameA' -Namespace Win32 -PassThru
# $api::GetAddressByNameA(dwNameSpace, lpServiceType, lpServiceName, lpiProtocols, dwResolution, lpServiceAsyncInfo, lpCsaddrBuffer, lpdwBufferLength, lpAliasBuffer, lpdwAliasBufferLength)
#uselib "MSWSOCK.dll"
#func global GetAddressByNameA "GetAddressByNameA" sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr
; GetAddressByNameA dwNameSpace, varptr(lpServiceType), lpServiceName, varptr(lpiProtocols), dwResolution, varptr(lpServiceAsyncInfo), lpCsaddrBuffer, varptr(lpdwBufferLength), varptr(lpAliasBuffer), varptr(lpdwAliasBufferLength)   ; 戻り値は stat
; dwNameSpace : DWORD -> "sptr"
; lpServiceType : GUID* -> "sptr"
; lpServiceName : LPSTR optional -> "sptr"
; lpiProtocols : INT* optional -> "sptr"
; dwResolution : DWORD -> "sptr"
; lpServiceAsyncInfo : SERVICE_ASYNC_INFO* optional -> "sptr"
; lpCsaddrBuffer : void* out -> "sptr"
; lpdwBufferLength : DWORD* in/out -> "sptr"
; lpAliasBuffer : LPSTR optional, in/out -> "sptr"
; lpdwAliasBufferLength : DWORD* in/out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "MSWSOCK.dll"
#cfunc global GetAddressByNameA "GetAddressByNameA" int, var, str, var, int, var, sptr, var, var, var
; res = GetAddressByNameA(dwNameSpace, lpServiceType, lpServiceName, lpiProtocols, dwResolution, lpServiceAsyncInfo, lpCsaddrBuffer, lpdwBufferLength, lpAliasBuffer, lpdwAliasBufferLength)
; dwNameSpace : DWORD -> "int"
; lpServiceType : GUID* -> "var"
; lpServiceName : LPSTR optional -> "str"
; lpiProtocols : INT* optional -> "var"
; dwResolution : DWORD -> "int"
; lpServiceAsyncInfo : SERVICE_ASYNC_INFO* optional -> "var"
; lpCsaddrBuffer : void* out -> "sptr"
; lpdwBufferLength : DWORD* in/out -> "var"
; lpAliasBuffer : LPSTR optional, in/out -> "var"
; lpdwAliasBufferLength : DWORD* in/out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; INT GetAddressByNameA(DWORD dwNameSpace, GUID* lpServiceType, LPSTR lpServiceName, INT* lpiProtocols, DWORD dwResolution, SERVICE_ASYNC_INFO* lpServiceAsyncInfo, void* lpCsaddrBuffer, DWORD* lpdwBufferLength, LPSTR lpAliasBuffer, DWORD* lpdwAliasBufferLength)
#uselib "MSWSOCK.dll"
#cfunc global GetAddressByNameA "GetAddressByNameA" int, var, str, var, int, var, intptr, var, var, var
; res = GetAddressByNameA(dwNameSpace, lpServiceType, lpServiceName, lpiProtocols, dwResolution, lpServiceAsyncInfo, lpCsaddrBuffer, lpdwBufferLength, lpAliasBuffer, lpdwAliasBufferLength)
; dwNameSpace : DWORD -> "int"
; lpServiceType : GUID* -> "var"
; lpServiceName : LPSTR optional -> "str"
; lpiProtocols : INT* optional -> "var"
; dwResolution : DWORD -> "int"
; lpServiceAsyncInfo : SERVICE_ASYNC_INFO* optional -> "var"
; lpCsaddrBuffer : void* out -> "intptr"
; lpdwBufferLength : DWORD* in/out -> "var"
; lpAliasBuffer : LPSTR optional, in/out -> "var"
; lpdwAliasBufferLength : DWORD* in/out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	mswsock = windows.NewLazySystemDLL("MSWSOCK.dll")
	procGetAddressByNameA = mswsock.NewProc("GetAddressByNameA")
)

// dwNameSpace (DWORD), lpServiceType (GUID*), lpServiceName (LPSTR optional), lpiProtocols (INT* optional), dwResolution (DWORD), lpServiceAsyncInfo (SERVICE_ASYNC_INFO* optional), lpCsaddrBuffer (void* out), lpdwBufferLength (DWORD* in/out), lpAliasBuffer (LPSTR optional, in/out), lpdwAliasBufferLength (DWORD* in/out)
r1, _, err := procGetAddressByNameA.Call(
	uintptr(dwNameSpace),
	uintptr(lpServiceType),
	uintptr(unsafe.Pointer(windows.BytePtrFromString(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 GetAddressByNameA(
  dwNameSpace: DWORD;   // DWORD
  lpServiceType: PGUID;   // GUID*
  lpServiceName: PAnsiChar;   // LPSTR optional
  lpiProtocols: Pointer;   // INT* optional
  dwResolution: DWORD;   // DWORD
  lpServiceAsyncInfo: Pointer;   // SERVICE_ASYNC_INFO* optional
  lpCsaddrBuffer: Pointer;   // void* out
  lpdwBufferLength: Pointer;   // DWORD* in/out
  lpAliasBuffer: PAnsiChar;   // LPSTR optional, in/out
  lpdwAliasBufferLength: Pointer   // DWORD* in/out
): Integer; stdcall;
  external 'MSWSOCK.dll' name 'GetAddressByNameA';
result := DllCall("MSWSOCK\GetAddressByNameA"
    , "UInt", dwNameSpace   ; DWORD
    , "Ptr", lpServiceType   ; GUID*
    , "AStr", lpServiceName   ; LPSTR 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   ; LPSTR optional, in/out
    , "Ptr", lpdwAliasBufferLength   ; DWORD* in/out
    , "Int")   ; return: INT
●GetAddressByNameA(dwNameSpace, lpServiceType, lpServiceName, lpiProtocols, dwResolution, lpServiceAsyncInfo, lpCsaddrBuffer, lpdwBufferLength, lpAliasBuffer, lpdwAliasBufferLength) = DLL("MSWSOCK.dll", "int GetAddressByNameA(dword, void*, char*, void*, dword, void*, void*, void*, char*, void*)")
# 呼び出し: GetAddressByNameA(dwNameSpace, lpServiceType, lpServiceName, lpiProtocols, dwResolution, lpServiceAsyncInfo, lpCsaddrBuffer, lpdwBufferLength, lpAliasBuffer, lpdwAliasBufferLength)
# dwNameSpace : DWORD -> "dword"
# lpServiceType : GUID* -> "void*"
# lpServiceName : LPSTR 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 : LPSTR optional, in/out -> "char*"
# lpdwAliasBufferLength : DWORD* in/out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "mswsock" fn GetAddressByNameA(
    dwNameSpace: u32, // DWORD
    lpServiceType: [*c]GUID, // GUID*
    lpServiceName: [*c]const u8, // LPSTR 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]u8, // LPSTR optional, in/out
    lpdwAliasBufferLength: [*c]u32 // DWORD* in/out
) callconv(std.os.windows.WINAPI) i32;
proc GetAddressByNameA(
    dwNameSpace: uint32,  # DWORD
    lpServiceType: ptr GUID,  # GUID*
    lpServiceName: cstring,  # LPSTR 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 char,  # LPSTR optional, in/out
    lpdwAliasBufferLength: ptr uint32  # DWORD* in/out
): int32 {.importc: "GetAddressByNameA", stdcall, dynlib: "MSWSOCK.dll".}
pragma(lib, "mswsock");
extern(Windows)
int GetAddressByNameA(
    uint dwNameSpace,   // DWORD
    GUID* lpServiceType,   // GUID*
    const(char)* lpServiceName,   // LPSTR 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
    char* lpAliasBuffer,   // LPSTR optional, in/out
    uint* lpdwAliasBufferLength   // DWORD* in/out
);
ccall((:GetAddressByNameA, "MSWSOCK.dll"), stdcall, Int32,
      (UInt32, Ptr{GUID}, Cstring, Ptr{Int32}, UInt32, Ptr{SERVICE_ASYNC_INFO}, Ptr{Cvoid}, Ptr{UInt32}, Ptr{UInt8}, Ptr{UInt32}),
      dwNameSpace, lpServiceType, lpServiceName, lpiProtocols, dwResolution, lpServiceAsyncInfo, lpCsaddrBuffer, lpdwBufferLength, lpAliasBuffer, lpdwAliasBufferLength)
# dwNameSpace : DWORD -> UInt32
# lpServiceType : GUID* -> Ptr{GUID}
# lpServiceName : LPSTR optional -> Cstring
# 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 : LPSTR optional, in/out -> Ptr{UInt8}
# lpdwAliasBufferLength : DWORD* in/out -> Ptr{UInt32}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
int32_t GetAddressByNameA(
    uint32_t dwNameSpace,
    void* lpServiceType,
    const char* lpServiceName,
    int32_t* lpiProtocols,
    uint32_t dwResolution,
    void* lpServiceAsyncInfo,
    void* lpCsaddrBuffer,
    uint32_t* lpdwBufferLength,
    char* lpAliasBuffer,
    uint32_t* lpdwAliasBufferLength);
]]
local mswsock = ffi.load("mswsock")
-- mswsock.GetAddressByNameA(dwNameSpace, lpServiceType, lpServiceName, lpiProtocols, dwResolution, lpServiceAsyncInfo, lpCsaddrBuffer, lpdwBufferLength, lpAliasBuffer, lpdwAliasBufferLength)
-- dwNameSpace : DWORD
-- lpServiceType : GUID*
-- lpServiceName : LPSTR optional
-- lpiProtocols : INT* optional
-- dwResolution : DWORD
-- lpServiceAsyncInfo : SERVICE_ASYNC_INFO* optional
-- lpCsaddrBuffer : void* out
-- lpdwBufferLength : DWORD* in/out
-- lpAliasBuffer : LPSTR optional, in/out
-- lpdwAliasBufferLength : DWORD* in/out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('MSWSOCK.dll');
const GetAddressByNameA = lib.func('__stdcall', 'GetAddressByNameA', 'int32_t', ['uint32_t', 'void *', 'str', 'int32_t *', 'uint32_t', 'void *', 'void *', 'uint32_t *', 'char *', 'uint32_t *']);
// GetAddressByNameA(dwNameSpace, lpServiceType, lpServiceName, lpiProtocols, dwResolution, lpServiceAsyncInfo, lpCsaddrBuffer, lpdwBufferLength, lpAliasBuffer, lpdwAliasBufferLength)
// dwNameSpace : DWORD -> 'uint32_t'
// lpServiceType : GUID* -> 'void *'
// lpServiceName : LPSTR optional -> 'str'
// 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 : LPSTR optional, in/out -> 'char *'
// lpdwAliasBufferLength : DWORD* in/out -> 'uint32_t *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("MSWSOCK.dll", {
  GetAddressByNameA: { parameters: ["u32", "pointer", "buffer", "pointer", "u32", "pointer", "pointer", "pointer", "buffer", "pointer"], result: "i32" },
});
// lib.symbols.GetAddressByNameA(dwNameSpace, lpServiceType, lpServiceName, lpiProtocols, dwResolution, lpServiceAsyncInfo, lpCsaddrBuffer, lpdwBufferLength, lpAliasBuffer, lpdwAliasBufferLength)
// dwNameSpace : DWORD -> "u32"
// lpServiceType : GUID* -> "pointer"
// lpServiceName : LPSTR 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 : LPSTR optional, in/out -> "buffer"
// lpdwAliasBufferLength : DWORD* in/out -> "pointer"
// 文字列は "buffer"。ANSI(-A) は new TextEncoder() で UTF-8/ANSI バイト列(末尾に \x00)を渡す。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
int32_t GetAddressByNameA(
    uint32_t dwNameSpace,
    void* lpServiceType,
    const char* lpServiceName,
    int32_t* lpiProtocols,
    uint32_t dwResolution,
    void* lpServiceAsyncInfo,
    void* lpCsaddrBuffer,
    uint32_t* lpdwBufferLength,
    char* lpAliasBuffer,
    uint32_t* lpdwAliasBufferLength);
C, "MSWSOCK.dll");
// $ffi->GetAddressByNameA(dwNameSpace, lpServiceType, lpServiceName, lpiProtocols, dwResolution, lpServiceAsyncInfo, lpCsaddrBuffer, lpdwBufferLength, lpAliasBuffer, lpdwAliasBufferLength);
// dwNameSpace : DWORD
// lpServiceType : GUID*
// lpServiceName : LPSTR optional
// lpiProtocols : INT* optional
// dwResolution : DWORD
// lpServiceAsyncInfo : SERVICE_ASYNC_INFO* optional
// lpCsaddrBuffer : void* out
// lpdwBufferLength : DWORD* in/out
// lpAliasBuffer : LPSTR 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.ASCII_OPTIONS);
    int GetAddressByNameA(
        int dwNameSpace,   // DWORD
        Pointer lpServiceType,   // GUID*
        String lpServiceName,   // LPSTR optional
        IntByReference lpiProtocols,   // INT* optional
        int dwResolution,   // DWORD
        Pointer lpServiceAsyncInfo,   // SERVICE_ASYNC_INFO* optional
        Pointer lpCsaddrBuffer,   // void* out
        IntByReference lpdwBufferLength,   // DWORD* in/out
        byte[] lpAliasBuffer,   // LPSTR optional, in/out
        IntByReference lpdwAliasBufferLength   // DWORD* in/out
    );
}
@[Link("mswsock")]
lib LibMSWSOCK
  fun GetAddressByNameA = GetAddressByNameA(
    dwNameSpace : UInt32,   # DWORD
    lpServiceType : GUID*,   # GUID*
    lpServiceName : UInt8*,   # LPSTR 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 : UInt8*,   # LPSTR 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 GetAddressByNameANative = Int32 Function(Uint32, Pointer<Void>, Pointer<Utf8>, Pointer<Int32>, Uint32, Pointer<Void>, Pointer<Void>, Pointer<Uint32>, Pointer<Utf8>, Pointer<Uint32>);
typedef GetAddressByNameADart = int Function(int, Pointer<Void>, Pointer<Utf8>, Pointer<Int32>, int, Pointer<Void>, Pointer<Void>, Pointer<Uint32>, Pointer<Utf8>, Pointer<Uint32>);
final GetAddressByNameA = DynamicLibrary.open('MSWSOCK.dll')
    .lookupFunction<GetAddressByNameANative, GetAddressByNameADart>('GetAddressByNameA');
// dwNameSpace : DWORD -> Uint32
// lpServiceType : GUID* -> Pointer<Void>
// lpServiceName : LPSTR optional -> Pointer<Utf8>
// 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 : LPSTR optional, in/out -> Pointer<Utf8>
// lpdwAliasBufferLength : DWORD* in/out -> Pointer<Uint32>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function GetAddressByNameA(
  dwNameSpace: DWORD;   // DWORD
  lpServiceType: PGUID;   // GUID*
  lpServiceName: PAnsiChar;   // LPSTR optional
  lpiProtocols: Pointer;   // INT* optional
  dwResolution: DWORD;   // DWORD
  lpServiceAsyncInfo: Pointer;   // SERVICE_ASYNC_INFO* optional
  lpCsaddrBuffer: Pointer;   // void* out
  lpdwBufferLength: Pointer;   // DWORD* in/out
  lpAliasBuffer: PAnsiChar;   // LPSTR optional, in/out
  lpdwAliasBufferLength: Pointer   // DWORD* in/out
): Integer; stdcall;
  external 'MSWSOCK.dll' name 'GetAddressByNameA';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "GetAddressByNameA"
  c_GetAddressByNameA :: Word32 -> Ptr () -> CString -> Ptr Int32 -> Word32 -> Ptr () -> Ptr () -> Ptr Word32 -> CString -> Ptr Word32 -> IO Int32
-- dwNameSpace : DWORD -> Word32
-- lpServiceType : GUID* -> Ptr ()
-- lpServiceName : LPSTR optional -> CString
-- 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 : LPSTR optional, in/out -> CString
-- lpdwAliasBufferLength : DWORD* in/out -> Ptr Word32
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let getaddressbynamea =
  foreign "GetAddressByNameA"
    (uint32_t @-> (ptr void) @-> string @-> (ptr int32_t) @-> uint32_t @-> (ptr void) @-> (ptr void) @-> (ptr uint32_t) @-> string @-> (ptr uint32_t) @-> returning int32_t)
(* dwNameSpace : DWORD -> uint32_t *)
(* lpServiceType : GUID* -> (ptr void) *)
(* lpServiceName : LPSTR optional -> string *)
(* 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 : LPSTR optional, in/out -> string *)
(* 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 ("GetAddressByNameA" get-address-by-name-a :convention :stdcall) :int32
  (dw-name-space :uint32)   ; DWORD
  (lp-service-type :pointer)   ; GUID*
  (lp-service-name :string)   ; LPSTR 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)   ; LPSTR 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 $GetAddressByNameA = Win32::API::More->new('MSWSOCK',
    'int GetAddressByNameA(DWORD dwNameSpace, LPVOID lpServiceType, LPCSTR lpServiceName, LPVOID lpiProtocols, DWORD dwResolution, LPVOID lpServiceAsyncInfo, LPVOID lpCsaddrBuffer, LPVOID lpdwBufferLength, LPSTR lpAliasBuffer, LPVOID lpdwAliasBufferLength)');
# my $ret = $GetAddressByNameA->Call($dwNameSpace, $lpServiceType, $lpServiceName, $lpiProtocols, $dwResolution, $lpServiceAsyncInfo, $lpCsaddrBuffer, $lpdwBufferLength, $lpAliasBuffer, $lpdwAliasBufferLength);
# dwNameSpace : DWORD -> DWORD
# lpServiceType : GUID* -> LPVOID
# lpServiceName : LPSTR optional -> LPCSTR
# lpiProtocols : INT* optional -> LPVOID
# dwResolution : DWORD -> DWORD
# lpServiceAsyncInfo : SERVICE_ASYNC_INFO* optional -> LPVOID
# lpCsaddrBuffer : void* out -> LPVOID
# lpdwBufferLength : DWORD* in/out -> LPVOID
# lpAliasBuffer : LPSTR optional, in/out -> LPSTR
# lpdwAliasBufferLength : DWORD* in/out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

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