GetAddressByNameA
関数シグネチャ
// 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
);パラメーター
| 名前 | 型 | 方向 | 説明 | ||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| dwNameSpace | DWORD | in | オペレーティングシステムがネットワークアドレス情報を照会する対象となる名前空間、または既定の名前空間の集合です。 名前空間を指定するには、次の定数のいずれかを使用します。
GetAddressByName の呼び出しでは、ほとんどの場合、特別な値 NS_DEFAULT を使用すべきです。これにより、クライアントはインターネットワーク上で利用可能な名前空間を把握していなくても済みます。名前空間へのアクセスはシステム管理者が決定します。名前空間はクライアントが変更を意識することなく、追加されたり削除されたりできます。 | ||||||||||||||
| lpServiceType | GUID* | in | ネットワークサービスの種類を指定するグローバル一意識別子 (GUID) へのポインターです。Svcguid.h ヘッダーファイルには、いくつかの GUID サービス型の定義と、それらを操作するためのマクロが含まれています。 Svcguid.h ヘッダーファイルは、Winsock2.h ヘッダーファイルによって自動的にインクルードされません。 | ||||||||||||||
| lpServiceName | LPSTR | inoptional | サービス名を一意に表すゼロ終端文字列へのポインターです。たとえば "MY SNA SERVER" などです。 lpServiceName を NULL に設定することは、dwResolution を RES_SERVICE に設定することと同等です。この関数は 2 番目のモードで動作し、指定された種類のサービスがバインドすべきローカルアドレスを取得します。この関数は、*lpCsaddrBuffer に格納される CSADDR_INFO 構造体の LocalAddr メンバーにローカルアドレスを格納します。 dwResolution が RES_SERVICE に設定されている場合、この関数は lpServiceName パラメーターを無視します。 dwNameSpace が NS_DNS に設定されている場合、*lpServiceName はホスト名です。 | ||||||||||||||
| lpiProtocols | INT* | inoptional | プロトコル識別子のゼロ終端配列へのポインターです。この関数は、名前解決の試行をこれらのプロトコルを提供する名前空間プロバイダーに限定します。これにより、呼び出し元は検索の範囲を制限できます。 lpiProtocols が NULL に設定されている場合、この関数は利用可能なすべてのプロトコルに関する情報を取得します。 | ||||||||||||||
| dwResolution | DWORD | in | サービス名解決処理の各側面を指定するビットフラグの集合です。次のビットフラグが定義されています。 | ||||||||||||||
| lpServiceAsyncInfo | SERVICE_ASYNC_INFO* | inoptional | 将来の使用のために予約されています。NULL に設定する必要があります。 | ||||||||||||||
| lpCsaddrBuffer | void* | out | 1 つ以上の CSADDR_INFO データ構造体を受け取るバッファーへのポインターです。バッファーに書き込まれる構造体の数は、解決の試行で見つかった情報の量によって異なります。多くの場合は 1 つだけですが、複数の構造体が書き込まれることを想定しておくべきです。 | ||||||||||||||
| lpdwBufferLength | DWORD* | inout | 入力時には、lpCsaddrBuffer が指すバッファーのサイズ (バイト単位) を指定する変数へのポインターです。 出力時には、この変数は CSADDR_INFO 構造体の配列を格納するために必要な総バイト数を含みます。この値が *lpdwBufferLength の入力値以下で、かつ関数が成功した場合、これはバッファーに実際に格納されたバイト数です。この値が lpdwBufferLength の入力値より大きい場合、バッファーが小さすぎたことを意味し、lpdwBufferLength の出力値は必要な最小バッファーサイズとなります。 | ||||||||||||||
| lpAliasBuffer | LPSTR | inoutoptional | ネットワークサービスのエイリアス情報を受け取るバッファーへのポインターです。 名前空間がエイリアスをサポートしている場合、この関数は lpAliasBuffer が指すバッファーにゼロ終端の名前文字列の配列を格納します。リストの末尾にはゼロ終端が 2 つ続きます。配列の最初の名前はサービスのプライマリ名です。それに続く名前はエイリアスです。エイリアスをサポートする名前空間の例として DNS があります。 名前空間がエイリアスをサポートしていない場合は、バッファーに 2 つのゼロ終端を格納します。 このパラメーターは省略可能で、NULL に設定できます。 | ||||||||||||||
| lpdwAliasBufferLength | DWORD* | inout | 入力時には、lpAliasBuffer が指すバッファーのサイズを要素数 (文字数) で指定する変数へのポインターです。 出力時には、この変数は名前文字列の配列を格納するために必要な総要素数 (文字数) を含みます。この値が *lpdwAliasBufferLength の入力値以下で、かつ関数が成功した場合、これはバッファーに実際に格納された要素数です。この値が lpdwAliasBufferLength の入力値より大きい場合、バッファーが小さすぎたことを意味し、lpdwAliasBufferLength の出力値は必要な最小バッファーサイズとなります。 lpAliasBuffer が NULL の場合、lpdwAliasBufferLength は意味を持たず、NULL にすることもできます。 |
戻り値の型: INT
公式ドキュメント
GetAddressByName は Windows Sockets 2 以降では使用できません。(ANSI)
戻り値
関数が成功した場合、戻り値は lpCsaddrBuffer が指すバッファーに書き込まれた CSADDR_INFO データ構造体の数です。
関数が失敗した場合、戻り値は SOCKET_ERROR (-1) です。拡張エラー情報を取得するには GetLastError を呼び出します。次の拡張エラー値が返されます。
| エラーコード | 意味 |
|---|---|
| lpCsaddrBuffer が指すバッファーが、関連するすべての CSADDR_INFO 構造体を受け取るには小さすぎました。*lpdwBufferLength に返された値以上のサイズのバッファーを指定して、関数を呼び出してください。 |
解説(Remarks)
この関数は gethostbyname 関数のより強力なバージョンです。GetAddressByName 関数は複数のネームサービスで動作します。
GetAddressByName 関数を使用すると、クライアントはネットワークサービスの Windows Sockets アドレスを取得できます。クライアントは、対象とするサービスをそのサービスの種類とサービス名で指定します。
多くのネームサービスは、サービス名を解決する際にネームサービスプロバイダーが考慮する既定のプレフィックスまたはサフィックスをサポートしています。たとえば DNS 名前空間で、ドメインが "nt.microsoft.com" という名前で、入力として "ftp millikan" が指定された場合、DNS ソフトウェアは "millikan" の解決には失敗しますが、"millikan.nt.microsoft.com" の解決には成功します。
GetAddressByName 関数は、特定の名前空間内、または既定の名前空間の集合内という 2 つの方法でサービスアドレスを検索できることに注意してください。既定の名前空間を使用すると、管理者は特定の名前空間を名前で指定された場合にのみサービスアドレスの検索対象とするよう指定できます。また、管理者やネームスペースのセットアッププログラムは、名前空間の検索順序を制御することもできます。
nspapi.h ヘッダーは、GetAddressByName を、UNICODE プリプロセッサ定数の定義に基づいてこの関数の ANSI 版または Unicode 版を自動的に選択するエイリアスとして定義します。エンコーディング中立なエイリアスの使用を、エンコーディング中立でないコードと混在させると、不一致が生じてコンパイルエラーまたは実行時エラーを引き起こす可能性があります。詳細については、関数プロトタイプの規則 を参照してください。
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 方式にも切替可。#uselib "MSWSOCK.dll" #cfunc global GetAddressByNameA "GetAddressByNameA" int, sptr, str, sptr, int, sptr, sptr, sptr, sptr, sptr ; res = GetAddressByNameA(dwNameSpace, varptr(lpServiceType), lpServiceName, varptr(lpiProtocols), dwResolution, varptr(lpServiceAsyncInfo), lpCsaddrBuffer, varptr(lpdwBufferLength), varptr(lpAliasBuffer), varptr(lpdwAliasBufferLength)) ; dwNameSpace : DWORD -> "int" ; lpServiceType : GUID* -> "sptr" ; lpServiceName : LPSTR optional -> "str" ; lpiProtocols : INT* optional -> "sptr" ; dwResolution : DWORD -> "int" ; 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" ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは 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 方式にも切替可。; 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, intptr, str, intptr, int, intptr, intptr, intptr, intptr, intptr ; res = GetAddressByNameA(dwNameSpace, varptr(lpServiceType), lpServiceName, varptr(lpiProtocols), dwResolution, varptr(lpServiceAsyncInfo), lpCsaddrBuffer, varptr(lpdwBufferLength), varptr(lpAliasBuffer), varptr(lpdwAliasBufferLength)) ; dwNameSpace : DWORD -> "int" ; lpServiceType : GUID* -> "intptr" ; lpServiceName : LPSTR optional -> "str" ; lpiProtocols : INT* optional -> "intptr" ; dwResolution : DWORD -> "int" ; lpServiceAsyncInfo : SERVICE_ASYNC_INFO* optional -> "intptr" ; lpCsaddrBuffer : void* out -> "intptr" ; lpdwBufferLength : DWORD* in/out -> "intptr" ; lpAliasBuffer : LPSTR optional, in/out -> "intptr" ; lpdwAliasBufferLength : DWORD* in/out -> "intptr" ; ※出力/バッファ引数はポインタ方式(token=intptr / 呼び出しは 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 // INTfunction 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 を使用。関連項目
- f GetAddressByNameW (Unicode版) — サービス名から対応するアドレス情報を取得する。
- s CSADDR_INFO
- f getaddrinfo — ホスト名やサービス名からアドレス情報を解決する。
- f gethostbyname — ホスト名から対応するホスト情報を取得する。