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

SnmpGetPduData

関数
WinSNMPのPDUから種類や変数バインド等のデータを取得する。
DLLwsnmp32.dll呼出規約winapi対応OSWindows 2000 以降

シグネチャ

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

DWORD SnmpGetPduData(
    INT_PTR PDU,
    SNMP_PDU_TYPE* PDU_type,
    INT* request_id,
    SNMP_ERROR* error_status,
    INT* error_index,
    INT_PTR* varbindlist
);

パラメーター

名前型方向説明
PDUINT_PTRinSNMP PDU のハンドル。
PDU_typeSNMP_PDU_TYPE*inout

指定された PDU の PDU_type フィールドを受け取る変数へのポインター。このパラメーターには NULL、または次のいずれかの値を指定できます。

値 意味
SNMP_PDU_GET
指定された SNMP 変数から値を検索して取得します。
SNMP_PDU_GETNEXT
変数の正確な名前を知らなくても、SNMP 変数の値を検索して取得します。
SNMP_PDU_RESPONSE
SNMP_PDU_GET 要求または SNMP_PDU_GETNEXT 要求に対する応答です。
SNMP_PDU_SET
指定された SNMP 変数に値を格納します。
SNMP_PDU_GETBULK
1 回の要求で複数の値を検索して取得します。
SNMP_PDU_TRAP
SNMPv2C において、特別なイベントの発生を管理システムに通知します。
request_idINT*inout指定された PDU の request_id フィールドを受け取る変数へのポインター。このパラメーターには NULL を指定できます。
error_statusSNMP_ERROR*inout

指定された PDU の error_status フィールドを受け取る変数へのポインター。PDU_type パラメーターが SNMP_PDU_GETBULK と等しい場合、このパラメーターは PDU の non_repeaters フィールドの値を受け取ります。

このパラメーターには NULL、または次のいずれかの値を指定できます。最初の 6 つのエラーは、SNMP バージョン 1 (SNMPv1) と SNMP バージョン 2C (SNMPv2C) の両方のフレームワークに共通です。残りのエラーは SNMPv2C でのみ使用できます。

エラーコード 意味
SNMP_ERROR_NOERROR
転送中にエラーが発生しなかったことをエージェントが報告します。
SNMP_ERROR_TOOBIG
エージェントは、要求された SNMP 操作の結果を 1 つの SNMP メッセージに収めることができませんでした。
SNMP_ERROR_NOSUCHNAME
要求された SNMP 操作が、不明な変数を指定しました。
SNMP_ERROR_BADVALUE
要求された SNMP 操作が変数を変更しようとしましたが、構文エラーまたは値のエラーが指定されました。
SNMP_ERROR_READONLY
要求された SNMP 操作が、変数のコミュニティプロファイルによって変更が許可されていない変数を変更しようとしました。
SNMP_ERROR_GENERR
要求された SNMP 操作中に、ここに挙げたもの以外のエラーが発生しました。
SNMP_ERROR_NOACCESS
指定された SNMP 変数にはアクセスできません。
SNMP_ERROR_WRONGTYPE
値が、その変数に必要な型と一致しない型を指定しています。
SNMP_ERROR_WRONGLENGTH
値が、その変数に必要な長さと一致しない長さを指定しています。
SNMP_ERROR_WRONGENCODING
値に、そのフィールドの ASN.1 タグと一致しない Abstract Syntax Notation One (ASN.1) エンコードが含まれています。
SNMP_ERROR_WRONGVALUE
値を変数に割り当てることができません。
SNMP_ERROR_NOCREATION
変数が存在せず、エージェントはそれを作成できません。
SNMP_ERROR_INCONSISTENTVALUE
値が、他の管理対象オブジェクトの値と矛盾しています。
SNMP_ERROR_RESOURCEUNAVAILABLE
値を変数に割り当てるには、現在利用できないリソースの割り当てが必要です。
SNMP_ERROR_COMMITFAILED
検証エラーは発生しませんでしたが、変数は 1 つも更新されませんでした。
SNMP_ERROR_UNDOFAILED
検証エラーは発生しませんでした。一部の変数は、その割り当てを取り消すことができなかったため更新されました。
SNMP_ERROR_AUTHORIZATIONERROR
承認エラーが発生しました。
SNMP_ERROR_NOTWRITABLE
変数は存在しますが、エージェントはそれを変更できません。
SNMP_ERROR_INCONSISTENTNAME
変数が存在しません。名前付きオブジェクトインスタンスが他の管理対象オブジェクトの値と矛盾しているため、エージェントはそれを作成できません。
error_indexINT*inout

指定された PDU の error_index フィールドを受け取る変数へのポインター。

PDU_type パラメーターが SNMP_PDU_GETBULK と等しい場合、このパラメーターは指定された PDU の max_repetitions フィールドの値を受け取ります。このパラメーターには NULL を指定できます。

varbindlistINT_PTR*inout指定された PDU の変数バインディングリストフィールドへのハンドルを受け取る変数へのポインター。このパラメーターには NULL を指定できます。詳細については、以下の「解説」セクションを参照してください。

戻り値の型: DWORD

公式ドキュメント

WinSNMP の SnmpGetPduData 関数は、指定された SNMP プロトコルデータユニット (PDU) から、選択されたデータフィールドを返します。

戻り値

関数が成功した場合、戻り値は SNMPAPI_SUCCESS です。

関数が失敗した場合、戻り値は SNMPAPI_FAILURE です。拡張エラー情報を取得するには、 SnmpGetLastError を呼び出します。 SnmpGetLastError 関数は、次のいずれかのエラーを返す場合があります。

戻り値 説明
SNMPAPI_NOT_INITIALIZED

SnmpStartup 関数が正常に完了しませんでした。

SNMPAPI_ALLOC_ERROR
メモリの割り当て中にエラーが発生しました。
SNMPAPI_NOOP
すべての出力パラメーターが NULL です。SNMP 操作は実行されませんでした。
SNMPAPI_PDU_INVALID
PDU の種類が無効です。
SNMPAPI_OTHER_ERROR
不明または未定義のエラーが発生しました。

解説(Remarks)

SnmpGetPduData 関数のすべてのパラメーターは必須です。ただし、PDU パラメーターを除くすべてのパラメーターには NULL を指定できます。アプリケーションが NULL として渡したパラメーターについては、 SnmpGetPduData 関数は値を返しません。

varbindlist パラメーターが NULL でない場合、 SnmpGetPduData 関数は常に新しい変数バインディングリストオブジェクトへのハンドルを返します。さらに、PDU パラメーターが新しい PDU を指定している場合、この関数はその新しい PDU にもハンドルを関連付けます。

アプリケーションが NULL ではない varbindlist パラメーターを指定して SnmpGetPduData を呼び出した場合でも、PDU パラメーターが既存の PDU を指定しているときは、この関数は複製された新しい変数バインディングリストへのハンドルを返します。この呼び出しは、既存の PDU に関連付けられているハンドルに影響を与えません。既存の PDU とは、アプリケーションが SnmpCreatePdu 関数の呼び出しによって作成した PDU、またはアプリケーションが受信した後に SnmpGetPduData の呼び出しによって読み取った PDU です。

アプリケーションが SnmpCreatePdu で PDU を作成したとき、またはアプリケーションが SnmpGetPduData を使用して PDU を読み取った後、Microsoft WinSNMP 実装は、アプリケーションが PDU の各フィールドの値を「把握している」ことを前提とします。アプリケーションが SnmpGetPduData で PDU を 2 回目に読み取ると、その呼び出しにより、指定された PDU の変数バインディングリストのコピーが作成されます。この種の SnmpGetPduData の呼び出しは、PDU へのハンドルも複製します。

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

各言語での呼び出し定義

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

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

SnmpGetPduData = ctypes.windll.wsnmp32.SnmpGetPduData
SnmpGetPduData.restype = wintypes.DWORD
SnmpGetPduData.argtypes = [
    ctypes.c_ssize_t,  # PDU : INT_PTR
    ctypes.c_void_p,  # PDU_type : SNMP_PDU_TYPE* in/out
    ctypes.POINTER(ctypes.c_int),  # request_id : INT* in/out
    ctypes.c_void_p,  # error_status : SNMP_ERROR* in/out
    ctypes.POINTER(ctypes.c_int),  # error_index : INT* in/out
    ctypes.POINTER(ctypes.c_ssize_t),  # varbindlist : INT_PTR* in/out
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('wsnmp32.dll')
SnmpGetPduData = Fiddle::Function.new(
  lib['SnmpGetPduData'],
  [
    Fiddle::TYPE_INTPTR_T,  # PDU : INT_PTR
    Fiddle::TYPE_VOIDP,  # PDU_type : SNMP_PDU_TYPE* in/out
    Fiddle::TYPE_VOIDP,  # request_id : INT* in/out
    Fiddle::TYPE_VOIDP,  # error_status : SNMP_ERROR* in/out
    Fiddle::TYPE_VOIDP,  # error_index : INT* in/out
    Fiddle::TYPE_VOIDP,  # varbindlist : INT_PTR* in/out
  ],
  -Fiddle::TYPE_INT)
#[link(name = "wsnmp32")]
extern "system" {
    fn SnmpGetPduData(
        PDU: isize,  // INT_PTR
        PDU_type: *mut u32,  // SNMP_PDU_TYPE* in/out
        request_id: *mut i32,  // INT* in/out
        error_status: *mut u32,  // SNMP_ERROR* in/out
        error_index: *mut i32,  // INT* in/out
        varbindlist: *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 SnmpGetPduData(IntPtr PDU, ref uint PDU_type, ref int request_id, ref uint error_status, ref int error_index, ref IntPtr varbindlist);
"@
$api = Add-Type -MemberDefinition $sig -Name 'wsnmp32_SnmpGetPduData' -Namespace Win32 -PassThru
# $api::SnmpGetPduData(PDU, PDU_type, request_id, error_status, error_index, varbindlist)
#uselib "wsnmp32.dll"
#func global SnmpGetPduData "SnmpGetPduData" sptr, sptr, sptr, sptr, sptr, sptr
; SnmpGetPduData PDU, varptr(PDU_type), varptr(request_id), varptr(error_status), varptr(error_index), varptr(varbindlist)   ; 戻り値は stat
; PDU : INT_PTR -> "sptr"
; PDU_type : SNMP_PDU_TYPE* in/out -> "sptr"
; request_id : INT* in/out -> "sptr"
; error_status : SNMP_ERROR* in/out -> "sptr"
; error_index : INT* in/out -> "sptr"
; varbindlist : INT_PTR* in/out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "wsnmp32.dll"
#cfunc global SnmpGetPduData "SnmpGetPduData" sptr, var, var, var, var, var
; res = SnmpGetPduData(PDU, PDU_type, request_id, error_status, error_index, varbindlist)
; PDU : INT_PTR -> "sptr"
; PDU_type : SNMP_PDU_TYPE* in/out -> "var"
; request_id : INT* in/out -> "var"
; error_status : SNMP_ERROR* in/out -> "var"
; error_index : INT* in/out -> "var"
; varbindlist : INT_PTR* in/out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; DWORD SnmpGetPduData(INT_PTR PDU, SNMP_PDU_TYPE* PDU_type, INT* request_id, SNMP_ERROR* error_status, INT* error_index, INT_PTR* varbindlist)
#uselib "wsnmp32.dll"
#cfunc global SnmpGetPduData "SnmpGetPduData" intptr, var, var, var, var, var
; res = SnmpGetPduData(PDU, PDU_type, request_id, error_status, error_index, varbindlist)
; PDU : INT_PTR -> "intptr"
; PDU_type : SNMP_PDU_TYPE* in/out -> "var"
; request_id : INT* in/out -> "var"
; error_status : SNMP_ERROR* in/out -> "var"
; error_index : INT* in/out -> "var"
; varbindlist : INT_PTR* in/out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	wsnmp32 = windows.NewLazySystemDLL("wsnmp32.dll")
	procSnmpGetPduData = wsnmp32.NewProc("SnmpGetPduData")
)

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

extern "wsnmp32" fn SnmpGetPduData(
    PDU: isize, // INT_PTR
    PDU_type: [*c]u32, // SNMP_PDU_TYPE* in/out
    request_id: [*c]i32, // INT* in/out
    error_status: [*c]u32, // SNMP_ERROR* in/out
    error_index: [*c]i32, // INT* in/out
    varbindlist: [*c]isize // INT_PTR* in/out
) callconv(std.os.windows.WINAPI) u32;
proc SnmpGetPduData(
    PDU: int,  # INT_PTR
    PDU_type: ptr uint32,  # SNMP_PDU_TYPE* in/out
    request_id: ptr int32,  # INT* in/out
    error_status: ptr uint32,  # SNMP_ERROR* in/out
    error_index: ptr int32,  # INT* in/out
    varbindlist: ptr int  # INT_PTR* in/out
): uint32 {.importc: "SnmpGetPduData", stdcall, dynlib: "wsnmp32.dll".}
pragma(lib, "wsnmp32");
extern(Windows)
uint SnmpGetPduData(
    ptrdiff_t PDU,   // INT_PTR
    uint* PDU_type,   // SNMP_PDU_TYPE* in/out
    int* request_id,   // INT* in/out
    uint* error_status,   // SNMP_ERROR* in/out
    int* error_index,   // INT* in/out
    ptrdiff_t* varbindlist   // INT_PTR* in/out
);
ccall((:SnmpGetPduData, "wsnmp32.dll"), stdcall, UInt32,
      (Int, Ptr{UInt32}, Ptr{Int32}, Ptr{UInt32}, Ptr{Int32}, Ptr{Int}),
      PDU, PDU_type, request_id, error_status, error_index, varbindlist)
# PDU : INT_PTR -> Int
# PDU_type : SNMP_PDU_TYPE* in/out -> Ptr{UInt32}
# request_id : INT* in/out -> Ptr{Int32}
# error_status : SNMP_ERROR* in/out -> Ptr{UInt32}
# error_index : INT* in/out -> Ptr{Int32}
# varbindlist : INT_PTR* in/out -> Ptr{Int}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
uint32_t SnmpGetPduData(
    intptr_t PDU,
    uint32_t* PDU_type,
    int32_t* request_id,
    uint32_t* error_status,
    int32_t* error_index,
    intptr_t* varbindlist);
]]
local wsnmp32 = ffi.load("wsnmp32")
-- wsnmp32.SnmpGetPduData(PDU, PDU_type, request_id, error_status, error_index, varbindlist)
-- PDU : INT_PTR
-- PDU_type : SNMP_PDU_TYPE* in/out
-- request_id : INT* in/out
-- error_status : SNMP_ERROR* in/out
-- error_index : INT* in/out
-- varbindlist : INT_PTR* in/out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('wsnmp32.dll');
const SnmpGetPduData = lib.func('__stdcall', 'SnmpGetPduData', 'uint32_t', ['intptr_t', 'uint32_t *', 'int32_t *', 'uint32_t *', 'int32_t *', 'intptr_t *']);
// SnmpGetPduData(PDU, PDU_type, request_id, error_status, error_index, varbindlist)
// PDU : INT_PTR -> 'intptr_t'
// PDU_type : SNMP_PDU_TYPE* in/out -> 'uint32_t *'
// request_id : INT* in/out -> 'int32_t *'
// error_status : SNMP_ERROR* in/out -> 'uint32_t *'
// error_index : INT* in/out -> 'int32_t *'
// varbindlist : INT_PTR* in/out -> 'intptr_t *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("wsnmp32.dll", {
  SnmpGetPduData: { parameters: ["isize", "pointer", "pointer", "pointer", "pointer", "pointer"], result: "u32" },
});
// lib.symbols.SnmpGetPduData(PDU, PDU_type, request_id, error_status, error_index, varbindlist)
// PDU : INT_PTR -> "isize"
// PDU_type : SNMP_PDU_TYPE* in/out -> "pointer"
// request_id : INT* in/out -> "pointer"
// error_status : SNMP_ERROR* in/out -> "pointer"
// error_index : INT* in/out -> "pointer"
// varbindlist : INT_PTR* in/out -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
uint32_t SnmpGetPduData(
    intptr_t PDU,
    uint32_t* PDU_type,
    int32_t* request_id,
    uint32_t* error_status,
    int32_t* error_index,
    intptr_t* varbindlist);
C, "wsnmp32.dll");
// $ffi->SnmpGetPduData(PDU, PDU_type, request_id, error_status, error_index, varbindlist);
// PDU : INT_PTR
// PDU_type : SNMP_PDU_TYPE* in/out
// request_id : INT* in/out
// error_status : SNMP_ERROR* in/out
// error_index : INT* in/out
// varbindlist : 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 SnmpGetPduData(
        long PDU,   // INT_PTR
        IntByReference PDU_type,   // SNMP_PDU_TYPE* in/out
        IntByReference request_id,   // INT* in/out
        IntByReference error_status,   // SNMP_ERROR* in/out
        IntByReference error_index,   // INT* in/out
        LongByReference varbindlist   // INT_PTR* in/out
    );
}
@[Link("wsnmp32")]
lib Libwsnmp32
  fun SnmpGetPduData = SnmpGetPduData(
    PDU : LibC::SSizeT,   # INT_PTR
    PDU_type : UInt32*,   # SNMP_PDU_TYPE* in/out
    request_id : Int32*,   # INT* in/out
    error_status : UInt32*,   # SNMP_ERROR* in/out
    error_index : Int32*,   # INT* in/out
    varbindlist : 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 SnmpGetPduDataNative = Uint32 Function(IntPtr, Pointer<Uint32>, Pointer<Int32>, Pointer<Uint32>, Pointer<Int32>, Pointer<IntPtr>);
typedef SnmpGetPduDataDart = int Function(int, Pointer<Uint32>, Pointer<Int32>, Pointer<Uint32>, Pointer<Int32>, Pointer<IntPtr>);
final SnmpGetPduData = DynamicLibrary.open('wsnmp32.dll')
    .lookupFunction<SnmpGetPduDataNative, SnmpGetPduDataDart>('SnmpGetPduData');
// PDU : INT_PTR -> IntPtr
// PDU_type : SNMP_PDU_TYPE* in/out -> Pointer<Uint32>
// request_id : INT* in/out -> Pointer<Int32>
// error_status : SNMP_ERROR* in/out -> Pointer<Uint32>
// error_index : INT* in/out -> Pointer<Int32>
// varbindlist : INT_PTR* in/out -> Pointer<IntPtr>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function SnmpGetPduData(
  PDU: NativeInt;   // INT_PTR
  PDU_type: Pointer;   // SNMP_PDU_TYPE* in/out
  request_id: Pointer;   // INT* in/out
  error_status: Pointer;   // SNMP_ERROR* in/out
  error_index: Pointer;   // INT* in/out
  varbindlist: Pointer   // INT_PTR* in/out
): DWORD; stdcall;
  external 'wsnmp32.dll' name 'SnmpGetPduData';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "SnmpGetPduData"
  c_SnmpGetPduData :: CIntPtr -> Ptr Word32 -> Ptr Int32 -> Ptr Word32 -> Ptr Int32 -> Ptr CIntPtr -> IO Word32
-- PDU : INT_PTR -> CIntPtr
-- PDU_type : SNMP_PDU_TYPE* in/out -> Ptr Word32
-- request_id : INT* in/out -> Ptr Int32
-- error_status : SNMP_ERROR* in/out -> Ptr Word32
-- error_index : INT* in/out -> Ptr Int32
-- varbindlist : INT_PTR* in/out -> Ptr CIntPtr
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let snmpgetpdudata =
  foreign "SnmpGetPduData"
    (intptr_t @-> (ptr uint32_t) @-> (ptr int32_t) @-> (ptr uint32_t) @-> (ptr int32_t) @-> (ptr intptr_t) @-> returning uint32_t)
(* PDU : INT_PTR -> intptr_t *)
(* PDU_type : SNMP_PDU_TYPE* in/out -> (ptr uint32_t) *)
(* request_id : INT* in/out -> (ptr int32_t) *)
(* error_status : SNMP_ERROR* in/out -> (ptr uint32_t) *)
(* error_index : INT* in/out -> (ptr int32_t) *)
(* varbindlist : 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 ("SnmpGetPduData" snmp-get-pdu-data :convention :stdcall) :uint32
  (pdu :int64)   ; INT_PTR
  (pdu-type :pointer)   ; SNMP_PDU_TYPE* in/out
  (request-id :pointer)   ; INT* in/out
  (error-status :pointer)   ; SNMP_ERROR* in/out
  (error-index :pointer)   ; INT* in/out
  (varbindlist :pointer))   ; INT_PTR* in/out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $SnmpGetPduData = Win32::API::More->new('wsnmp32',
    'DWORD SnmpGetPduData(LPARAM PDU, LPVOID PDU_type, LPVOID request_id, LPVOID error_status, LPVOID error_index, LPVOID varbindlist)');
# my $ret = $SnmpGetPduData->Call($PDU, $PDU_type, $request_id, $error_status, $error_index, $varbindlist);
# PDU : INT_PTR -> LPARAM
# PDU_type : SNMP_PDU_TYPE* in/out -> LPVOID
# request_id : INT* in/out -> LPVOID
# error_status : SNMP_ERROR* in/out -> LPVOID
# error_index : INT* in/out -> LPVOID
# varbindlist : INT_PTR* in/out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

公式の関連項目
使用する型