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

WSAAsyncGetServByPort

関数
ポート番号のサービス情報を非同期で取得する。
DLLWS2_32.dll呼出規約winapiSetLastErrorあり対応OSWindows 2000 以降

シグネチャ

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

HANDLE WSAAsyncGetServByPort(
    HWND hWnd,
    DWORD wMsg,
    INT port,
    LPCSTR proto,
    LPSTR buf,
    INT buflen
);

パラメーター

名前方向説明
hWndHWNDin非同期要求が完了したときにメッセージを受け取るウィンドウのハンドル。
wMsgDWORDin非同期要求が完了したときに受け取るメッセージ。
portINTinサービスのポート。ネットワーク バイト順で指定します。
protoLPCSTRinプロトコル名へのポインター。NULL を指定できます。その場合、 WSAAsyncGetServByPort は指定した ports_port が一致する最初のサービス エントリを検索します。それ以外の場合、 WSAAsyncGetServByPortportproto の両方に一致するものを検索します。
bufLPSTRoutservent データを受け取るデータ領域へのポインター。Windows Sockets はこのデータ領域に servent 構造体と、その servent 構造体のメンバーから参照されるすべてのデータを格納するため、データ領域は servent 構造体のサイズよりも大きくする必要があります。MAXGETHOSTSTRUCT バイトのバッファーを推奨します。
buflenINTinbuf パラメーターのデータ領域のサイズ (バイト単位)。

戻り値の型: HANDLE

公式ドキュメント

WSAAsyncGetServByPort 関数 (winsock.h) は、ポートとプロトコルに対応するサービス情報を非同期に取得します。

戻り値

戻り値は、非同期操作が正常に開始されたかどうかを示します。操作自体の成否を示すものではありません。

エラーが発生しなかった場合、 WSAAsyncGetServByPort は要求の非同期タスク ハンドルを表す HANDLE 型の 0 以外の値を返します (Windows の HTASK と混同しないでください)。この値は 2 通りの方法で使用できます。 WSACancelAsyncRequest を使用して操作をキャンセルするために使用できるほか、wParam メッセージ パラメーターを調べることで、非同期操作と完了メッセージを対応付けるために使用できます。

非同期操作を開始できなかった場合、 WSAAsyncGetServByPort は 0 を返します。具体的なエラー番号は WSAGetLastError を呼び出して取得できます。

アプリケーション ウィンドウがメッセージを受け取ったときには、次のエラー コードが設定される場合があります。前述のとおり、これらは応答メッセージ内の lParam から WSAGETASYNCERROR マクロを使用して抽出できます。

エラー コード 意味
WSAENETDOWN
ネットワーク サブシステムが失敗しました。
WSAENOBUFS
利用可能なバッファー領域が不足しています。
WSAEFAULT
proto または buf パラメーターが、プロセス アドレス空間の有効な部分にありません。
WSAHOST_NOT_FOUND
信頼できる応答 (authoritative answer) でポートが見つかりませんでした。
WSATRY_AGAIN
信頼できない応答でポートが見つからなかったか、サーバーの障害です。
WSANO_RECOVERY
回復不能なエラーです。サービス データベースにアクセスできません。
WSANO_DATA
名前は有効ですが、要求された種類のデータ レコードがありません。

次のエラーは関数呼び出しの時点で発生する可能性があり、非同期操作を開始できなかったことを示します。

エラー コード 意味
WSANOTINITIALISED この関数を使用する前に、 WSAStartup の呼び出しが成功している必要があります。
WSAENETDOWN ネットワーク サブシステムが失敗しました。
WSAEINPROGRESS ブロッキングを伴う Windows Sockets 1.1 の呼び出しが進行中であるか、サービス プロバイダーがコールバック関数を処理中です。
WSAEWOULDBLOCK Windows Sockets 実装内のリソースまたはその他の制約により、現時点では非同期操作をスケジュールできません。

解説(Remarks)

WSAAsyncGetServByPort 関数は getservbyport の非同期版であり、ポート番号に対応するサービス情報を取得するために使用します。Windows Sockets は操作を開始し、ただちに呼び出し元に制御を返します。このとき、アプリケーションが操作を識別するために使用できる不透明な非同期タスク ハンドルを返します。操作が完了すると、結果 (存在する場合) が呼び出し元から提供されたバッファーにコピーされ、アプリケーションのウィンドウにメッセージが送信されます。

非同期操作が完了すると、hWnd パラメーターで指定されたアプリケーション ウィンドウが、wMsg パラメーターで指定されたメッセージを受け取ります。wParam パラメーターには、元の関数呼び出しで返された非同期タスク ハンドルが格納されます。lParam の上位 16 ビットにはエラー コードが格納されます。エラー コードは Winsock2.h で定義された任意のエラーになり得ます。エラー コードが 0 の場合は、非同期操作が正常に完了したことを示します。

正常に完了すると、元の関数呼び出しで指定されたバッファーには servent 構造体が格納されます。この構造体のメンバーにアクセスするには、元のバッファーのアドレスを servent 構造体へのポインターにキャストし、適切にアクセスします。

エラー コードが WSAENOBUFS の場合、元の呼び出しで buflen によって指定されたバッファーのサイズが、結果として得られるすべての情報を格納するには小さすぎたことを意味します。この場合、lParam の下位 16 ビットに、必要なすべての情報を提供するために必要なバッファーのサイズが格納されます。部分的なデータでは不十分であるとアプリケーションが判断した場合、必要なすべての情報を受け取るのに十分な大きさのバッファー (すなわち lParam の下位 16 ビット以上の大きさ) を指定して、 WSAAsyncGetServByPort 関数呼び出しを再発行できます。

この関数に指定されたバッファーは、Windows Sockets が servent 構造体と、同じ servent 構造体のメンバーから参照されるデータ領域の内容を構築するために使用されます。 WSAENOBUFS エラーを回避するには、アプリケーションは少なくとも MAXGETHOSTSTRUCT バイト (Winsock2.h で定義) のバッファーを提供する必要があります。

エラー コードとバッファー長は、Winsock2.h で次のように定義されているマクロ WSAGETASYNCERROR および WSAGETASYNCBUFLEN を使用して lParam から抽出します。

#include <windows.h>

#define WSAGETASYNCBUFLEN(lParam)           LOWORD(lParam)
#define WSAGETASYNCERROR(lParam)            HIWORD(lParam)

これらのマクロを使用すると、アプリケーションのソース コードの移植性を最大化できます。

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

各言語での呼び出し定義

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

HANDLE WSAAsyncGetServByPort(
    HWND hWnd,
    DWORD wMsg,
    INT port,
    LPCSTR proto,
    LPSTR buf,
    INT buflen
);
[DllImport("WS2_32.dll", SetLastError = true, ExactSpelling = true)]
static extern IntPtr WSAAsyncGetServByPort(
    IntPtr hWnd,   // HWND
    uint wMsg,   // DWORD
    int port,   // INT
    [MarshalAs(UnmanagedType.LPStr)] string proto,   // LPCSTR
    [MarshalAs(UnmanagedType.LPStr)] System.Text.StringBuilder buf,   // LPSTR out
    int buflen   // INT
);
<DllImport("WS2_32.dll", SetLastError:=True, ExactSpelling:=True)>
Public Shared Function WSAAsyncGetServByPort(
    hWnd As IntPtr,   ' HWND
    wMsg As UInteger,   ' DWORD
    port As Integer,   ' INT
    <MarshalAs(UnmanagedType.LPStr)> proto As String,   ' LPCSTR
    <MarshalAs(UnmanagedType.LPStr)> buf As System.Text.StringBuilder,   ' LPSTR out
    buflen As Integer   ' INT
) As IntPtr
End Function
' hWnd : HWND
' wMsg : DWORD
' port : INT
' proto : LPCSTR
' buf : LPSTR out
' buflen : INT
Declare PtrSafe Function WSAAsyncGetServByPort Lib "ws2_32" ( _
    ByVal hWnd As LongPtr, _
    ByVal wMsg As Long, _
    ByVal port As Long, _
    ByVal proto As String, _
    ByVal buf As String, _
    ByVal buflen As Long) As LongPtr
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

WSAAsyncGetServByPort = ctypes.windll.ws2_32.WSAAsyncGetServByPort
WSAAsyncGetServByPort.restype = ctypes.c_void_p
WSAAsyncGetServByPort.argtypes = [
    wintypes.HANDLE,  # hWnd : HWND
    wintypes.DWORD,  # wMsg : DWORD
    ctypes.c_int,  # port : INT
    wintypes.LPCSTR,  # proto : LPCSTR
    wintypes.LPSTR,  # buf : LPSTR out
    ctypes.c_int,  # buflen : INT
]
# GetLastError: use ctypes.GetLastError() (or ctypes.WinDLL(use_last_error=True))
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('WS2_32.dll')
WSAAsyncGetServByPort = Fiddle::Function.new(
  lib['WSAAsyncGetServByPort'],
  [
    Fiddle::TYPE_VOIDP,  # hWnd : HWND
    -Fiddle::TYPE_INT,  # wMsg : DWORD
    Fiddle::TYPE_INT,  # port : INT
    Fiddle::TYPE_VOIDP,  # proto : LPCSTR
    Fiddle::TYPE_VOIDP,  # buf : LPSTR out
    Fiddle::TYPE_INT,  # buflen : INT
  ],
  Fiddle::TYPE_VOIDP)
#[link(name = "ws2_32")]
extern "system" {
    fn WSAAsyncGetServByPort(
        hWnd: *mut core::ffi::c_void,  // HWND
        wMsg: u32,  // DWORD
        port: i32,  // INT
        proto: *const u8,  // LPCSTR
        buf: *mut u8,  // LPSTR out
        buflen: i32  // INT
    ) -> *mut core::ffi::c_void;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("WS2_32.dll", SetLastError = true)]
public static extern IntPtr WSAAsyncGetServByPort(IntPtr hWnd, uint wMsg, int port, [MarshalAs(UnmanagedType.LPStr)] string proto, [MarshalAs(UnmanagedType.LPStr)] System.Text.StringBuilder buf, int buflen);
"@
$api = Add-Type -MemberDefinition $sig -Name 'WS2_32_WSAAsyncGetServByPort' -Namespace Win32 -PassThru
# $api::WSAAsyncGetServByPort(hWnd, wMsg, port, proto, buf, buflen)
#uselib "WS2_32.dll"
#func global WSAAsyncGetServByPort "WSAAsyncGetServByPort" sptr, sptr, sptr, sptr, sptr, sptr
; WSAAsyncGetServByPort hWnd, wMsg, port, proto, varptr(buf), buflen   ; 戻り値は stat
; hWnd : HWND -> "sptr"
; wMsg : DWORD -> "sptr"
; port : INT -> "sptr"
; proto : LPCSTR -> "sptr"
; buf : LPSTR out -> "sptr"
; buflen : INT -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "WS2_32.dll"
#cfunc global WSAAsyncGetServByPort "WSAAsyncGetServByPort" sptr, int, int, str, var, int
; res = WSAAsyncGetServByPort(hWnd, wMsg, port, proto, buf, buflen)
; hWnd : HWND -> "sptr"
; wMsg : DWORD -> "int"
; port : INT -> "int"
; proto : LPCSTR -> "str"
; buf : LPSTR out -> "var"
; buflen : INT -> "int"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; HANDLE WSAAsyncGetServByPort(HWND hWnd, DWORD wMsg, INT port, LPCSTR proto, LPSTR buf, INT buflen)
#uselib "WS2_32.dll"
#cfunc global WSAAsyncGetServByPort "WSAAsyncGetServByPort" intptr, int, int, str, var, int
; res = WSAAsyncGetServByPort(hWnd, wMsg, port, proto, buf, buflen)
; hWnd : HWND -> "intptr"
; wMsg : DWORD -> "int"
; port : INT -> "int"
; proto : LPCSTR -> "str"
; buf : LPSTR out -> "var"
; buflen : INT -> "int"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	ws2_32 = windows.NewLazySystemDLL("WS2_32.dll")
	procWSAAsyncGetServByPort = ws2_32.NewProc("WSAAsyncGetServByPort")
)

// hWnd (HWND), wMsg (DWORD), port (INT), proto (LPCSTR), buf (LPSTR out), buflen (INT)
r1, _, err := procWSAAsyncGetServByPort.Call(
	uintptr(hWnd),
	uintptr(wMsg),
	uintptr(port),
	uintptr(unsafe.Pointer(windows.BytePtrFromString(proto))),
	uintptr(buf),
	uintptr(buflen),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // HANDLE
function WSAAsyncGetServByPort(
  hWnd: THandle;   // HWND
  wMsg: DWORD;   // DWORD
  port: Integer;   // INT
  proto: PAnsiChar;   // LPCSTR
  buf: PAnsiChar;   // LPSTR out
  buflen: Integer   // INT
): THandle; stdcall;
  external 'WS2_32.dll' name 'WSAAsyncGetServByPort';
result := DllCall("WS2_32\WSAAsyncGetServByPort"
    , "Ptr", hWnd   ; HWND
    , "UInt", wMsg   ; DWORD
    , "Int", port   ; INT
    , "AStr", proto   ; LPCSTR
    , "Ptr", buf   ; LPSTR out
    , "Int", buflen   ; INT
    , "Ptr")   ; return: HANDLE
●WSAAsyncGetServByPort(hWnd, wMsg, port, proto, buf, buflen) = DLL("WS2_32.dll", "void* WSAAsyncGetServByPort(void*, dword, int, char*, char*, int)")
# 呼び出し: WSAAsyncGetServByPort(hWnd, wMsg, port, proto, buf, buflen)
# hWnd : HWND -> "void*"
# wMsg : DWORD -> "dword"
# port : INT -> "int"
# proto : LPCSTR -> "char*"
# buf : LPSTR out -> "char*"
# buflen : INT -> "int"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "ws2_32" fn WSAAsyncGetServByPort(
    hWnd: ?*anyopaque, // HWND
    wMsg: u32, // DWORD
    port: i32, // INT
    proto: [*c]const u8, // LPCSTR
    buf: [*c]u8, // LPSTR out
    buflen: i32 // INT
) callconv(std.os.windows.WINAPI) ?*anyopaque;
proc WSAAsyncGetServByPort(
    hWnd: pointer,  # HWND
    wMsg: uint32,  # DWORD
    port: int32,  # INT
    proto: cstring,  # LPCSTR
    buf: ptr char,  # LPSTR out
    buflen: int32  # INT
): pointer {.importc: "WSAAsyncGetServByPort", stdcall, dynlib: "WS2_32.dll".}
pragma(lib, "ws2_32");
extern(Windows)
void* WSAAsyncGetServByPort(
    void* hWnd,   // HWND
    uint wMsg,   // DWORD
    int port,   // INT
    const(char)* proto,   // LPCSTR
    char* buf,   // LPSTR out
    int buflen   // INT
);
ccall((:WSAAsyncGetServByPort, "WS2_32.dll"), stdcall, Ptr{Cvoid},
      (Ptr{Cvoid}, UInt32, Int32, Cstring, Ptr{UInt8}, Int32),
      hWnd, wMsg, port, proto, buf, buflen)
# hWnd : HWND -> Ptr{Cvoid}
# wMsg : DWORD -> UInt32
# port : INT -> Int32
# proto : LPCSTR -> Cstring
# buf : LPSTR out -> Ptr{UInt8}
# buflen : INT -> Int32
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
void* WSAAsyncGetServByPort(
    void* hWnd,
    uint32_t wMsg,
    int32_t port,
    const char* proto,
    char* buf,
    int32_t buflen);
]]
local ws2_32 = ffi.load("ws2_32")
-- ws2_32.WSAAsyncGetServByPort(hWnd, wMsg, port, proto, buf, buflen)
-- hWnd : HWND
-- wMsg : DWORD
-- port : INT
-- proto : LPCSTR
-- buf : LPSTR out
-- buflen : INT
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('WS2_32.dll');
const WSAAsyncGetServByPort = lib.func('__stdcall', 'WSAAsyncGetServByPort', 'void *', ['void *', 'uint32_t', 'int32_t', 'str', 'char *', 'int32_t']);
// WSAAsyncGetServByPort(hWnd, wMsg, port, proto, buf, buflen)
// hWnd : HWND -> 'void *'
// wMsg : DWORD -> 'uint32_t'
// port : INT -> 'int32_t'
// proto : LPCSTR -> 'str'
// buf : LPSTR out -> 'char *'
// buflen : INT -> 'int32_t'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("WS2_32.dll", {
  WSAAsyncGetServByPort: { parameters: ["pointer", "u32", "i32", "buffer", "buffer", "i32"], result: "pointer" },
});
// lib.symbols.WSAAsyncGetServByPort(hWnd, wMsg, port, proto, buf, buflen)
// hWnd : HWND -> "pointer"
// wMsg : DWORD -> "u32"
// port : INT -> "i32"
// proto : LPCSTR -> "buffer"
// buf : LPSTR out -> "buffer"
// buflen : INT -> "i32"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
void* WSAAsyncGetServByPort(
    void* hWnd,
    uint32_t wMsg,
    int32_t port,
    const char* proto,
    char* buf,
    int32_t buflen);
C, "WS2_32.dll");
// $ffi->WSAAsyncGetServByPort(hWnd, wMsg, port, proto, buf, buflen);
// hWnd : HWND
// wMsg : DWORD
// port : INT
// proto : LPCSTR
// buf : LPSTR out
// buflen : INT
// 構造体/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 Ws2_32 extends StdCallLibrary {
    Ws2_32 INSTANCE = Native.load("ws2_32", Ws2_32.class);
    Pointer WSAAsyncGetServByPort(
        Pointer hWnd,   // HWND
        int wMsg,   // DWORD
        int port,   // INT
        String proto,   // LPCSTR
        byte[] buf,   // LPSTR out
        int buflen   // INT
    );
}
@[Link("ws2_32")]
lib LibWS2_32
  fun WSAAsyncGetServByPort = WSAAsyncGetServByPort(
    hWnd : Void*,   # HWND
    wMsg : UInt32,   # DWORD
    port : Int32,   # INT
    proto : UInt8*,   # LPCSTR
    buf : UInt8*,   # LPSTR out
    buflen : Int32   # INT
  ) : Void*
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef WSAAsyncGetServByPortNative = Pointer<Void> Function(Pointer<Void>, Uint32, Int32, Pointer<Utf8>, Pointer<Utf8>, Int32);
typedef WSAAsyncGetServByPortDart = Pointer<Void> Function(Pointer<Void>, int, int, Pointer<Utf8>, Pointer<Utf8>, int);
final WSAAsyncGetServByPort = DynamicLibrary.open('WS2_32.dll')
    .lookupFunction<WSAAsyncGetServByPortNative, WSAAsyncGetServByPortDart>('WSAAsyncGetServByPort');
// hWnd : HWND -> Pointer<Void>
// wMsg : DWORD -> Uint32
// port : INT -> Int32
// proto : LPCSTR -> Pointer<Utf8>
// buf : LPSTR out -> Pointer<Utf8>
// buflen : INT -> Int32
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function WSAAsyncGetServByPort(
  hWnd: THandle;   // HWND
  wMsg: DWORD;   // DWORD
  port: Integer;   // INT
  proto: PAnsiChar;   // LPCSTR
  buf: PAnsiChar;   // LPSTR out
  buflen: Integer   // INT
): THandle; stdcall;
  external 'WS2_32.dll' name 'WSAAsyncGetServByPort';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "WSAAsyncGetServByPort"
  c_WSAAsyncGetServByPort :: Ptr () -> Word32 -> Int32 -> CString -> CString -> Int32 -> IO (Ptr ())
-- hWnd : HWND -> Ptr ()
-- wMsg : DWORD -> Word32
-- port : INT -> Int32
-- proto : LPCSTR -> CString
-- buf : LPSTR out -> CString
-- buflen : INT -> Int32
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let wsaasyncgetservbyport =
  foreign "WSAAsyncGetServByPort"
    ((ptr void) @-> uint32_t @-> int32_t @-> string @-> string @-> int32_t @-> returning (ptr void))
(* hWnd : HWND -> (ptr void) *)
(* wMsg : DWORD -> uint32_t *)
(* port : INT -> int32_t *)
(* proto : LPCSTR -> string *)
(* buf : LPSTR out -> string *)
(* buflen : INT -> int32_t *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library ws2_32 (t "WS2_32.dll"))
(cffi:use-foreign-library ws2_32)

(cffi:defcfun ("WSAAsyncGetServByPort" wsaasync-get-serv-by-port :convention :stdcall) :pointer
  (h-wnd :pointer)   ; HWND
  (w-msg :uint32)   ; DWORD
  (port :int32)   ; INT
  (proto :string)   ; LPCSTR
  (buf :pointer)   ; LPSTR out
  (buflen :int32))   ; INT
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $WSAAsyncGetServByPort = Win32::API::More->new('WS2_32',
    'HANDLE WSAAsyncGetServByPort(HANDLE hWnd, DWORD wMsg, int port, LPCSTR proto, LPSTR buf, int buflen)');
# my $ret = $WSAAsyncGetServByPort->Call($hWnd, $wMsg, $port, $proto, $buf, $buflen);
# hWnd : HWND -> HANDLE
# wMsg : DWORD -> DWORD
# port : INT -> int
# proto : LPCSTR -> LPCSTR
# buf : LPSTR out -> LPSTR
# buflen : INT -> int
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

公式の関連項目