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

SnmpGetVb

関数
変数バインドリストの指定位置のOIDと値を取得する。
DLLwsnmp32.dll呼出規約winapi対応OSWindows 2000 以降

シグネチャ

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

DWORD SnmpGetVb(
    INT_PTR vbl,
    DWORD index,
    smiOID* name,
    smiVALUE* value
);

パラメーター

名前型方向説明
vblINT_PTRin取得する変数バインディングリストのハンドル。
indexDWORDin

取得する変数バインディングエントリを識別する、符号なし long 整数型の変数を指定します。この変数には、変数バインディングリスト内における変数バインディングエントリの位置が格納されます。

このパラメーターの有効な値は 1 から n までの範囲です。1 は変数バインディングリストの最初の変数バインディングエントリを示し、n はリスト内のエントリの総数です。詳細については、後述の「解説」セクションを参照してください。

namesmiOID*inout変数バインディングエントリの変数名を受け取る smiOID 構造体へのポインター。
valuesmiVALUE*inout

name パラメーターで識別される変数に関連付けられた値を受け取る smiVALUE 構造体へのポインター。

関数が成功した場合、value パラメーターが指す構造体の syntax メンバーは、次の構文データ型のいずれかになります。詳細については、RFC 1902「Structure of Management Information for Version 2 of the Simple Network Management Protocol (SNMPv2)」を参照してください。

構文データ型 意味
SNMP_SYNTAX_INT
32 ビットの符号付き整数変数を示します。
SNMP_SYNTAX_OCTETS
バイナリデータまたはテキストデータであるオクテット文字列変数を示します。
SNMP_SYNTAX_NULL
NULL 値を示します。
SNMP_SYNTAX_OID
最大 128 個のサブ識別子から成る、割り当てられた名前であるオブジェクト識別子変数を示します。
SNMP_SYNTAX_INT32
32 ビットの符号付き整数変数を示します。
SNMP_SYNTAX_IPADDR
32 ビットのインターネットアドレス変数を示します。IPv6 アドレスの表現に SNMPv1 PDU トラップ形式が使用される場合、この値は 0.0.0.0 になります。
SNMP_SYNTAX_CNTR32
最大値 (2^32) – 1 に達するまで増加するカウンター変数を示します。
SNMP_SYNTAX_GAUGE32
増減はするものの最大値を超えることのない非負整数である、ゲージ変数を示します。
SNMP_SYNTAX_TIMETICKS
最大値 (2^32) – 1 に達するまで、100 分の 1 秒単位で時間を計測するカウンター変数を示します。これは、特定のタイマーイベントを基準とする非負整数です。
SNMP_SYNTAX_OPAQUE
この型は下位互換性のために提供されているものであり、新しいオブジェクト型に使用しないでください。任意の Abstract Syntax Notation One (ASN.1) 構文を渡す機能をサポートします。
SNMP_SYNTAX_CNTR64
最大値 (2^64) – 1 に達するまで増加するカウンター変数を示します。
SNMP_SYNTAX_UINT32
32 ビットの符号なし整数変数を示します。
SNMP_SYNTAX_NOSUCHOBJECT
エージェントが、その変数に対応するオブジェクト型をサポートしていないことを示します。
SNMP_SYNTAX_NOSUCHINSTANCE
その操作の対象となるオブジェクトインスタンスが存在しないことを示します。
SNMP_SYNTAX_ENDOFMIBVIEW
WinSNMP アプリケーションが、エージェントがサポートする MIB ツリーの終端を越えたオブジェクト識別子を参照しようとしていることを示します。

戻り値の型: DWORD

公式ドキュメント

WinSNMP アプリケーションは、SnmpGetVb 関数を呼び出して変数バインディングリストから情報を取得します。この WinSNMP 関数は、index パラメーターで指定された変数バインディングエントリから、変数名とそれに関連付けられた値を取得します。

戻り値

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

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

リターンコード 説明
SNMPAPI_NOT_INITIALIZED

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

SNMPAPI_ALLOC_ERROR
メモリの割り当て中にエラーが発生しました。
SNMPAPI_INDEX_INVALID
index パラメーターが無効です。
SNMPAPI_VBL_INVALID
vbl パラメーターが無効です。
SNMPAPI_OTHER_ERROR
不明または未定義のエラーが発生しました。

解説(Remarks)

最後の 3 つの構文型は、SNMP バージョン 2C (SNMPv2C) フレームワークにおける例外状態を表します。

SnmpGetVb 関数は、変数バインディングエントリの変数名を name パラメーターが指す構造体に返します。また、その変数に関連付けられた値を value パラメーターが指す構造体に返します。

入力時、 SnmpGetVb 関数は、name パラメーターおよび value パラメーターがそれぞれ指す smiOID 構造体と smiVALUE 構造体のメンバーを無視します。関数が正常に完了すると、Microsoft WinSNMP 実装がこれらのメンバーを上書きします。

WinSNMP アプリケーションが index パラメーターに使用できる有効な値は、次のとおりです。

WinSNMP アプリケーションは、 SnmpFreeDescriptor 関数を呼び出して、name パラメーターが指す smiOID 構造体の ptr メンバーに割り当てられたリソースを解放する必要があります。また、次の条件下では、アプリケーションは SnmpFreeDescriptor 関数を呼び出して、value パラメーターが指す smiVALUE 構造体に割り当てられたリソースも解放する必要があります。value メンバーが smiOCTETS 構造体または smiOID 構造体である場合、アプリケーションは SnmpFreeDescriptor を呼び出して、これらの構造体に割り当てられたリソースを解放する必要があります。詳細については、 WinSNMP Data Management Concepts を参照してください。
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での呼び出し定義

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

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

SnmpGetVb = ctypes.windll.wsnmp32.SnmpGetVb
SnmpGetVb.restype = wintypes.DWORD
SnmpGetVb.argtypes = [
    ctypes.c_ssize_t,  # vbl : INT_PTR
    wintypes.DWORD,  # index : DWORD
    ctypes.c_void_p,  # name : smiOID* in/out
    ctypes.c_void_p,  # value : smiVALUE* in/out
]
require 'fiddle'
require 'fiddle/import'

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

var (
	wsnmp32 = windows.NewLazySystemDLL("wsnmp32.dll")
	procSnmpGetVb = wsnmp32.NewProc("SnmpGetVb")
)

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

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

foreign import stdcall safe "SnmpGetVb"
  c_SnmpGetVb :: CIntPtr -> Word32 -> Ptr () -> Ptr () -> IO Word32
-- vbl : INT_PTR -> CIntPtr
-- index : DWORD -> Word32
-- name : smiOID* in/out -> Ptr ()
-- value : smiVALUE* in/out -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let snmpgetvb =
  foreign "SnmpGetVb"
    (intptr_t @-> uint32_t @-> (ptr void) @-> (ptr void) @-> returning uint32_t)
(* vbl : INT_PTR -> intptr_t *)
(* index : DWORD -> uint32_t *)
(* name : smiOID* in/out -> (ptr void) *)
(* value : smiVALUE* in/out -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library wsnmp32 (t "wsnmp32.dll"))
(cffi:use-foreign-library wsnmp32)

(cffi:defcfun ("SnmpGetVb" snmp-get-vb :convention :stdcall) :uint32
  (vbl :int64)   ; INT_PTR
  (index :uint32)   ; DWORD
  (name :pointer)   ; smiOID* in/out
  (value :pointer))   ; smiVALUE* in/out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $SnmpGetVb = Win32::API::More->new('wsnmp32',
    'DWORD SnmpGetVb(LPARAM vbl, DWORD index, LPVOID name, LPVOID value)');
# my $ret = $SnmpGetVb->Call($vbl, $index, $name, $value);
# vbl : INT_PTR -> LPARAM
# index : DWORD -> DWORD
# name : smiOID* in/out -> LPVOID
# value : smiVALUE* in/out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

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