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

SnmpRecvMsg

関数
WinSNMPセッションで受信したメッセージを取り出す。
DLLwsnmp32.dll呼出規約winapi対応OSWindows 2000 以降

シグネチャ

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

DWORD SnmpRecvMsg(
    INT_PTR session,
    INT_PTR* srcEntity,
    INT_PTR* dstEntity,
    INT_PTR* context,
    INT_PTR* PDU
);

パラメーター

名前型方向説明
sessionINT_PTRinWinSNMP セッションへのハンドル。
srcEntityINT_PTR*inoutメッセージを送信するエンティティへのハンドルを受け取る変数へのポインター。 SnmpRegister 関数の srcEntity パラメーターは、トラップ通知の登録を行う管理エンティティへのハンドルを指定する点に注意してください。
dstEntityINT_PTR*inoutメッセージを受信するエンティティへのハンドルを受け取る変数へのポインター。 SnmpRegister 関数の dstEntity パラメーターは、トラップを送信する管理エンティティへのハンドルを指定する点に注意してください。
contextINT_PTR*inoutコンテキスト(管理対象オブジェクトリソースの集合)へのハンドルを受け取る変数へのポインター。srcEntity パラメーターで指定されたエンティティは、このコンテキストからメッセージを発行します。
PDUINT_PTR*inoutメッセージのプロトコルデータユニット (PDU) コンポーネントへのハンドルを受け取る変数へのポインター。

戻り値の型: DWORD

公式ドキュメント

WinSNMP の SnmpRecvMsg 関数は、SnmpSendMsg 関数の呼び出しによって送信された非同期要求のうち、完了した要求の結果を SNMP メッセージの形式で取得します。

戻り値

関数が成功した場合、戻り値は SNMPAPI_SUCCESS であり、出力パラメーターには前述のパラメーターの説明に示された値が格納されます。

関数が失敗した場合、戻り値は SNMPAPI_FAILURE です。ネットワークトランスポート層のエラーを示す拡張エラーコード、つまり SNMPAPI_TL_ で始まるコードで関数が失敗した場合も、WinSNMP アプリケーションが正常に回復できるように、出力パラメーターには前述の値が格納されます。

拡張エラー情報を取得するには、 SnmpGetLastError を呼び出します。 SnmpGetLastError 関数は、次の WinSNMP エラーまたはネットワークトランスポート層エラーのいずれかを返すことがあります。

戻り値 説明
SNMPAPI_NOT_INITIALIZED

SnmpStartup 関数が正常に完了していません。

SNMPAPI_ALLOC_ERROR
メモリの割り当て中にエラーが発生しました。
SNMPAPI_SESSION_INVALID
session パラメーターが無効です。
SNMPAPI_NOOP
指定されたセッションのキューには、現時点でメッセージがありません。
SNMPAPI_TL_NOT_INITIALIZED
ネットワークトランスポート層が初期化されていません。
SNMPAPI_TL_NOT_SUPPORTED
ネットワークトランスポート層が SNMP プロトコルをサポートしていません。
SNMPAPI_TL_NOT_AVAILABLE
ネットワークサブシステムに障害が発生しました。
SNMPAPI_TL_RESOURCE_ERROR
ネットワークトランスポート層でリソースエラーが発生しました。
SNMPAPI_TL_UNDELIVERABLE
dstEntity パラメーターで指定されたエンティティが利用できません。
SNMPAPI_TL_SRC_INVALID
srcEntity パラメーターで指定されたエンティティが初期化されていません。
SNMPAPI_TL_INVALID_PARAM
ネットワークトランスポート層の関数呼び出しが無効な入力パラメーターを受け取りました。
SNMPAPI_TL_PDU_TOO_BIG
PDU が大きすぎるため、ネットワークトランスポート層で送受信できません。
SNMPAPI_TL_OTHER
未定義のネットワークトランスポート層エラーが発生しました。
SNMPAPI_OTHER_ERROR
不明または未定義のエラーが発生しました。

詳細については、 Network Transport Errors を参照してください。

解説(Remarks)

SnmpCreateSession 関数は、アプリケーションのウィンドウハンドルと通知メッセージ識別子を Microsoft WinSNMP 実装に渡します。アプリケーションのウィンドウが wMsg パラメーターで指定された通知メッセージを受け取ったら、WinSNMP アプリケーションは SnmpCreateSession が返したセッションハンドルを指定して SnmpRecvMsg 関数を呼び出し、受信したプロトコルデータユニット (PDU) を取得する必要があります。詳細については、 About SNMP Messages を参照してください。

SnmpRecvMsg 関数は、2 つのエンティティハンドル、1 つのコンテキストハンドル、1 つの PDU ハンドルという 4 つのオブジェクトをインスタンス化し、それらのリソースを割り当てます。返された PDU の変数バインディングリストコンポーネントのハンドルは、WinSNMP アプリケーションが SnmpGetPduData 関数を呼び出すまでインスタンス化されません。 SnmpRecvMsg が返したリソースが不要になったら、WinSNMP アプリケーションは各リソースに対応する WinSNMP 関数を使用して、個々のリソースを解放する必要があります。詳細については、 SnmpFreePdu、 SnmpFreeEntity、および SnmpFreeContext を参照してください。

SNMP バージョン 1 のフレームワーク (SNMPv1) で動作するエンティティからトラップを受信すると、実装はそのトラップを SNMP バージョン 2C (SNMPv2C) の形式に変換します。そのため、 SnmpRecvMsg が配信するトラップは常に SNMPv2C 形式です。詳細については、 Translating Traps from SNMPv1 to SNMPv2C および WinSNMP Programming Tasks を参照してください。

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

各言語での呼び出し定義

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

DWORD SnmpRecvMsg(
    INT_PTR session,
    INT_PTR* srcEntity,
    INT_PTR* dstEntity,
    INT_PTR* context,
    INT_PTR* PDU
);
[DllImport("wsnmp32.dll", ExactSpelling = true)]
static extern uint SnmpRecvMsg(
    IntPtr session,   // INT_PTR
    ref IntPtr srcEntity,   // INT_PTR* in/out
    ref IntPtr dstEntity,   // INT_PTR* in/out
    ref IntPtr context,   // INT_PTR* in/out
    ref IntPtr PDU   // INT_PTR* in/out
);
<DllImport("wsnmp32.dll", ExactSpelling:=True)>
Public Shared Function SnmpRecvMsg(
    session As IntPtr,   ' INT_PTR
    ByRef srcEntity As IntPtr,   ' INT_PTR* in/out
    ByRef dstEntity As IntPtr,   ' INT_PTR* in/out
    ByRef context As IntPtr,   ' INT_PTR* in/out
    ByRef PDU As IntPtr   ' INT_PTR* in/out
) As UInteger
End Function
' session : INT_PTR
' srcEntity : INT_PTR* in/out
' dstEntity : INT_PTR* in/out
' context : INT_PTR* in/out
' PDU : INT_PTR* in/out
Declare PtrSafe Function SnmpRecvMsg Lib "wsnmp32" ( _
    ByVal session As LongPtr, _
    ByRef srcEntity As LongPtr, _
    ByRef dstEntity As LongPtr, _
    ByRef context As LongPtr, _
    ByRef PDU As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

SnmpRecvMsg = ctypes.windll.wsnmp32.SnmpRecvMsg
SnmpRecvMsg.restype = wintypes.DWORD
SnmpRecvMsg.argtypes = [
    ctypes.c_ssize_t,  # session : INT_PTR
    ctypes.POINTER(ctypes.c_ssize_t),  # srcEntity : INT_PTR* in/out
    ctypes.POINTER(ctypes.c_ssize_t),  # dstEntity : INT_PTR* in/out
    ctypes.POINTER(ctypes.c_ssize_t),  # context : INT_PTR* in/out
    ctypes.POINTER(ctypes.c_ssize_t),  # PDU : INT_PTR* in/out
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('wsnmp32.dll')
SnmpRecvMsg = Fiddle::Function.new(
  lib['SnmpRecvMsg'],
  [
    Fiddle::TYPE_INTPTR_T,  # session : INT_PTR
    Fiddle::TYPE_VOIDP,  # srcEntity : INT_PTR* in/out
    Fiddle::TYPE_VOIDP,  # dstEntity : INT_PTR* in/out
    Fiddle::TYPE_VOIDP,  # context : INT_PTR* in/out
    Fiddle::TYPE_VOIDP,  # PDU : INT_PTR* in/out
  ],
  -Fiddle::TYPE_INT)
#[link(name = "wsnmp32")]
extern "system" {
    fn SnmpRecvMsg(
        session: isize,  // INT_PTR
        srcEntity: *mut isize,  // INT_PTR* in/out
        dstEntity: *mut isize,  // INT_PTR* in/out
        context: *mut isize,  // INT_PTR* in/out
        PDU: *mut isize  // INT_PTR* in/out
    ) -> u32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("wsnmp32.dll")]
public static extern uint SnmpRecvMsg(IntPtr session, ref IntPtr srcEntity, ref IntPtr dstEntity, ref IntPtr context, ref IntPtr PDU);
"@
$api = Add-Type -MemberDefinition $sig -Name 'wsnmp32_SnmpRecvMsg' -Namespace Win32 -PassThru
# $api::SnmpRecvMsg(session, srcEntity, dstEntity, context, PDU)
#uselib "wsnmp32.dll"
#func global SnmpRecvMsg "SnmpRecvMsg" sptr, sptr, sptr, sptr, sptr
; SnmpRecvMsg session, varptr(srcEntity), varptr(dstEntity), varptr(context), varptr(PDU)   ; 戻り値は stat
; session : INT_PTR -> "sptr"
; srcEntity : INT_PTR* in/out -> "sptr"
; dstEntity : INT_PTR* in/out -> "sptr"
; context : INT_PTR* in/out -> "sptr"
; PDU : INT_PTR* in/out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "wsnmp32.dll"
#cfunc global SnmpRecvMsg "SnmpRecvMsg" sptr, var, var, var, var
; res = SnmpRecvMsg(session, srcEntity, dstEntity, context, PDU)
; session : INT_PTR -> "sptr"
; srcEntity : INT_PTR* in/out -> "var"
; dstEntity : INT_PTR* in/out -> "var"
; context : INT_PTR* in/out -> "var"
; PDU : INT_PTR* in/out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; DWORD SnmpRecvMsg(INT_PTR session, INT_PTR* srcEntity, INT_PTR* dstEntity, INT_PTR* context, INT_PTR* PDU)
#uselib "wsnmp32.dll"
#cfunc global SnmpRecvMsg "SnmpRecvMsg" intptr, var, var, var, var
; res = SnmpRecvMsg(session, srcEntity, dstEntity, context, PDU)
; session : INT_PTR -> "intptr"
; srcEntity : INT_PTR* in/out -> "var"
; dstEntity : INT_PTR* in/out -> "var"
; context : INT_PTR* in/out -> "var"
; PDU : INT_PTR* in/out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	wsnmp32 = windows.NewLazySystemDLL("wsnmp32.dll")
	procSnmpRecvMsg = wsnmp32.NewProc("SnmpRecvMsg")
)

// session (INT_PTR), srcEntity (INT_PTR* in/out), dstEntity (INT_PTR* in/out), context (INT_PTR* in/out), PDU (INT_PTR* in/out)
r1, _, err := procSnmpRecvMsg.Call(
	uintptr(session),
	uintptr(srcEntity),
	uintptr(dstEntity),
	uintptr(context),
	uintptr(PDU),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // DWORD
function SnmpRecvMsg(
  session: NativeInt;   // INT_PTR
  srcEntity: Pointer;   // INT_PTR* in/out
  dstEntity: Pointer;   // INT_PTR* in/out
  context: Pointer;   // INT_PTR* in/out
  PDU: Pointer   // INT_PTR* in/out
): DWORD; stdcall;
  external 'wsnmp32.dll' name 'SnmpRecvMsg';
result := DllCall("wsnmp32\SnmpRecvMsg"
    , "Ptr", session   ; INT_PTR
    , "Ptr", srcEntity   ; INT_PTR* in/out
    , "Ptr", dstEntity   ; INT_PTR* in/out
    , "Ptr", context   ; INT_PTR* in/out
    , "Ptr", PDU   ; INT_PTR* in/out
    , "UInt")   ; return: DWORD
●SnmpRecvMsg(session, srcEntity, dstEntity, context, PDU) = DLL("wsnmp32.dll", "dword SnmpRecvMsg(int, void*, void*, void*, void*)")
# 呼び出し: SnmpRecvMsg(session, srcEntity, dstEntity, context, PDU)
# session : INT_PTR -> "int"
# srcEntity : INT_PTR* in/out -> "void*"
# dstEntity : INT_PTR* in/out -> "void*"
# context : INT_PTR* in/out -> "void*"
# PDU : INT_PTR* in/out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "wsnmp32" fn SnmpRecvMsg(
    session: isize, // INT_PTR
    srcEntity: [*c]isize, // INT_PTR* in/out
    dstEntity: [*c]isize, // INT_PTR* in/out
    context: [*c]isize, // INT_PTR* in/out
    PDU: [*c]isize // INT_PTR* in/out
) callconv(std.os.windows.WINAPI) u32;
proc SnmpRecvMsg(
    session: int,  # INT_PTR
    srcEntity: ptr int,  # INT_PTR* in/out
    dstEntity: ptr int,  # INT_PTR* in/out
    context: ptr int,  # INT_PTR* in/out
    PDU: ptr int  # INT_PTR* in/out
): uint32 {.importc: "SnmpRecvMsg", stdcall, dynlib: "wsnmp32.dll".}
pragma(lib, "wsnmp32");
extern(Windows)
uint SnmpRecvMsg(
    ptrdiff_t session,   // INT_PTR
    ptrdiff_t* srcEntity,   // INT_PTR* in/out
    ptrdiff_t* dstEntity,   // INT_PTR* in/out
    ptrdiff_t* context,   // INT_PTR* in/out
    ptrdiff_t* PDU   // INT_PTR* in/out
);
ccall((:SnmpRecvMsg, "wsnmp32.dll"), stdcall, UInt32,
      (Int, Ptr{Int}, Ptr{Int}, Ptr{Int}, Ptr{Int}),
      session, srcEntity, dstEntity, context, PDU)
# session : INT_PTR -> Int
# srcEntity : INT_PTR* in/out -> Ptr{Int}
# dstEntity : INT_PTR* in/out -> Ptr{Int}
# context : INT_PTR* in/out -> Ptr{Int}
# PDU : INT_PTR* in/out -> Ptr{Int}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
uint32_t SnmpRecvMsg(
    intptr_t session,
    intptr_t* srcEntity,
    intptr_t* dstEntity,
    intptr_t* context,
    intptr_t* PDU);
]]
local wsnmp32 = ffi.load("wsnmp32")
-- wsnmp32.SnmpRecvMsg(session, srcEntity, dstEntity, context, PDU)
-- session : INT_PTR
-- srcEntity : INT_PTR* in/out
-- dstEntity : INT_PTR* in/out
-- context : INT_PTR* in/out
-- PDU : INT_PTR* in/out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('wsnmp32.dll');
const SnmpRecvMsg = lib.func('__stdcall', 'SnmpRecvMsg', 'uint32_t', ['intptr_t', 'intptr_t *', 'intptr_t *', 'intptr_t *', 'intptr_t *']);
// SnmpRecvMsg(session, srcEntity, dstEntity, context, PDU)
// session : INT_PTR -> 'intptr_t'
// srcEntity : INT_PTR* in/out -> 'intptr_t *'
// dstEntity : INT_PTR* in/out -> 'intptr_t *'
// context : INT_PTR* in/out -> 'intptr_t *'
// PDU : INT_PTR* in/out -> 'intptr_t *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("wsnmp32.dll", {
  SnmpRecvMsg: { parameters: ["isize", "pointer", "pointer", "pointer", "pointer"], result: "u32" },
});
// lib.symbols.SnmpRecvMsg(session, srcEntity, dstEntity, context, PDU)
// session : INT_PTR -> "isize"
// srcEntity : INT_PTR* in/out -> "pointer"
// dstEntity : INT_PTR* in/out -> "pointer"
// context : INT_PTR* in/out -> "pointer"
// PDU : INT_PTR* in/out -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
uint32_t SnmpRecvMsg(
    intptr_t session,
    intptr_t* srcEntity,
    intptr_t* dstEntity,
    intptr_t* context,
    intptr_t* PDU);
C, "wsnmp32.dll");
// $ffi->SnmpRecvMsg(session, srcEntity, dstEntity, context, PDU);
// session : INT_PTR
// srcEntity : INT_PTR* in/out
// dstEntity : INT_PTR* in/out
// context : INT_PTR* in/out
// PDU : INT_PTR* 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 Wsnmp32 extends StdCallLibrary {
    Wsnmp32 INSTANCE = Native.load("wsnmp32", Wsnmp32.class);
    int SnmpRecvMsg(
        long session,   // INT_PTR
        LongByReference srcEntity,   // INT_PTR* in/out
        LongByReference dstEntity,   // INT_PTR* in/out
        LongByReference context,   // INT_PTR* in/out
        LongByReference PDU   // INT_PTR* in/out
    );
}
@[Link("wsnmp32")]
lib Libwsnmp32
  fun SnmpRecvMsg = SnmpRecvMsg(
    session : LibC::SSizeT,   # INT_PTR
    srcEntity : LibC::SSizeT*,   # INT_PTR* in/out
    dstEntity : LibC::SSizeT*,   # INT_PTR* in/out
    context : LibC::SSizeT*,   # INT_PTR* in/out
    PDU : LibC::SSizeT*   # INT_PTR* in/out
  ) : UInt32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef SnmpRecvMsgNative = Uint32 Function(IntPtr, Pointer<IntPtr>, Pointer<IntPtr>, Pointer<IntPtr>, Pointer<IntPtr>);
typedef SnmpRecvMsgDart = int Function(int, Pointer<IntPtr>, Pointer<IntPtr>, Pointer<IntPtr>, Pointer<IntPtr>);
final SnmpRecvMsg = DynamicLibrary.open('wsnmp32.dll')
    .lookupFunction<SnmpRecvMsgNative, SnmpRecvMsgDart>('SnmpRecvMsg');
// session : INT_PTR -> IntPtr
// srcEntity : INT_PTR* in/out -> Pointer<IntPtr>
// dstEntity : INT_PTR* in/out -> Pointer<IntPtr>
// context : INT_PTR* in/out -> Pointer<IntPtr>
// PDU : INT_PTR* in/out -> Pointer<IntPtr>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function SnmpRecvMsg(
  session: NativeInt;   // INT_PTR
  srcEntity: Pointer;   // INT_PTR* in/out
  dstEntity: Pointer;   // INT_PTR* in/out
  context: Pointer;   // INT_PTR* in/out
  PDU: Pointer   // INT_PTR* in/out
): DWORD; stdcall;
  external 'wsnmp32.dll' name 'SnmpRecvMsg';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "SnmpRecvMsg"
  c_SnmpRecvMsg :: CIntPtr -> Ptr CIntPtr -> Ptr CIntPtr -> Ptr CIntPtr -> Ptr CIntPtr -> IO Word32
-- session : INT_PTR -> CIntPtr
-- srcEntity : INT_PTR* in/out -> Ptr CIntPtr
-- dstEntity : INT_PTR* in/out -> Ptr CIntPtr
-- context : INT_PTR* in/out -> Ptr CIntPtr
-- PDU : INT_PTR* in/out -> Ptr CIntPtr
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let snmprecvmsg =
  foreign "SnmpRecvMsg"
    (intptr_t @-> (ptr intptr_t) @-> (ptr intptr_t) @-> (ptr intptr_t) @-> (ptr intptr_t) @-> returning uint32_t)
(* session : INT_PTR -> intptr_t *)
(* srcEntity : INT_PTR* in/out -> (ptr intptr_t) *)
(* dstEntity : INT_PTR* in/out -> (ptr intptr_t) *)
(* context : INT_PTR* in/out -> (ptr intptr_t) *)
(* PDU : INT_PTR* in/out -> (ptr intptr_t) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library wsnmp32 (t "wsnmp32.dll"))
(cffi:use-foreign-library wsnmp32)

(cffi:defcfun ("SnmpRecvMsg" snmp-recv-msg :convention :stdcall) :uint32
  (session :int64)   ; INT_PTR
  (src-entity :pointer)   ; INT_PTR* in/out
  (dst-entity :pointer)   ; INT_PTR* in/out
  (context :pointer)   ; INT_PTR* in/out
  (pdu :pointer))   ; INT_PTR* in/out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $SnmpRecvMsg = Win32::API::More->new('wsnmp32',
    'DWORD SnmpRecvMsg(LPARAM session, LPVOID srcEntity, LPVOID dstEntity, LPVOID context, LPVOID PDU)');
# my $ret = $SnmpRecvMsg->Call($session, $srcEntity, $dstEntity, $context, $PDU);
# session : INT_PTR -> LPARAM
# srcEntity : INT_PTR* in/out -> LPVOID
# dstEntity : INT_PTR* in/out -> LPVOID
# context : INT_PTR* in/out -> LPVOID
# PDU : INT_PTR* in/out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

公式の関連項目