RpcServerInqBindingHandle
関数シグネチャ
// RPCRT4.dll
#include <windows.h>
RPC_STATUS RpcServerInqBindingHandle(
void** Binding
);パラメーター
| 名前 | 型 | 方向 | 説明 |
|---|---|---|---|
| Binding | void** | out | RPC_BINDING_HANDLE 構造体です。成功した場合、RpcServerInqBindingHandle を呼び出したスレッドで処理されている呼び出しのバインディング ハンドルを受け取ります。 呼び出しが失敗した場合、このパラメーターは未定義です。 |
戻り値の型: RPC_STATUS
公式ドキュメント
RpcServerInqBindingHandle を呼び出したスレッドで処理されている RPC 呼び出しのバインディング ハンドルを取得します。
戻り値
この関数は、成功すると RPC_S_OK を返します。失敗した場合は RPC_S_* エラーコードを返します。この関数は、現在 RPC 呼び出しを処理していないスレッドで呼び出された場合を除き、失敗することはありません。
解説(Remarks)
RpcServerInqBindingHandle は、この API を呼び出したスレッドで現在実行中の RPC 呼び出しのバインディング ハンドルを取得するために使用します。多くの RPC API は入力としてバインディング ハンドルを必要とするため、これはバインディング ハンドルを取得する便利な方法です。
バインディング ハンドルをパラメーターとして受け取るサーバー側の RPC API は、すべて NULL を有効な値として渡すことができます。バインディング ハンドルの代わりに NULL を渡すと、同じスレッドで現在実行中の RPC 呼び出しのバインディング ハンドルを使用することを示します。ただし、別のスレッドからサーバー側の API を呼び出す場合は、NULL 以外のバインディング ハンドルを指定する必要があります。
明示的なバインディング ハンドルを使用し、スレッド固有のコンテキスト ハンドルを使用しない場合、その呼び出しのバインディング ハンドルはサーバー マネージャー ルーチンの最初のパラメーターになります。一方、明示的なハンドルを使用しない場合やコンテキスト ハンドルを使用する場合は、RpcServerInqBindingHandle が別のスレッドで使用するバインディング ハンドルを取得する唯一の方法となります。
この API は非同期呼び出しと同期呼び出しの両方で使用できますが、非同期呼び出しではあまり有用ではありません。非同期 RPC 呼び出しでは常に非同期状態が最初のパラメーターとなり、そこから RpcAsyncGetCallHandle を使用してバインディング ハンドルを直接取得できるためです。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での呼び出し定義
// RPCRT4.dll
#include <windows.h>
RPC_STATUS RpcServerInqBindingHandle(
void** Binding
);[DllImport("RPCRT4.dll", ExactSpelling = true)]
static extern int RpcServerInqBindingHandle(
IntPtr Binding // void** out
);<DllImport("RPCRT4.dll", ExactSpelling:=True)>
Public Shared Function RpcServerInqBindingHandle(
Binding As IntPtr ' void** out
) As Integer
End Function' Binding : void** out
Declare PtrSafe Function RpcServerInqBindingHandle Lib "rpcrt4" ( _
ByVal Binding As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。import ctypes
from ctypes import wintypes
RpcServerInqBindingHandle = ctypes.windll.rpcrt4.RpcServerInqBindingHandle
RpcServerInqBindingHandle.restype = ctypes.c_int
RpcServerInqBindingHandle.argtypes = [
ctypes.c_void_p, # Binding : void** out
]require 'fiddle'
require 'fiddle/import'
lib = Fiddle.dlopen('RPCRT4.dll')
RpcServerInqBindingHandle = Fiddle::Function.new(
lib['RpcServerInqBindingHandle'],
[
Fiddle::TYPE_VOIDP, # Binding : void** out
],
Fiddle::TYPE_INT)#[link(name = "rpcrt4")]
extern "system" {
fn RpcServerInqBindingHandle(
Binding: *mut *mut () // void** out
) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.$sig = @"
[DllImport("RPCRT4.dll")]
public static extern int RpcServerInqBindingHandle(IntPtr Binding);
"@
$api = Add-Type -MemberDefinition $sig -Name 'RPCRT4_RpcServerInqBindingHandle' -Namespace Win32 -PassThru
# $api::RpcServerInqBindingHandle(Binding)#uselib "RPCRT4.dll"
#func global RpcServerInqBindingHandle "RpcServerInqBindingHandle" sptr
; RpcServerInqBindingHandle Binding ; 戻り値は stat
; Binding : void** out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。#uselib "RPCRT4.dll"
#cfunc global RpcServerInqBindingHandle "RpcServerInqBindingHandle" sptr
; res = RpcServerInqBindingHandle(Binding)
; Binding : void** out -> "sptr"; RPC_STATUS RpcServerInqBindingHandle(void** Binding)
#uselib "RPCRT4.dll"
#cfunc global RpcServerInqBindingHandle "RpcServerInqBindingHandle" intptr
; res = RpcServerInqBindingHandle(Binding)
; Binding : void** out -> "intptr"import (
"golang.org/x/sys/windows"
"unsafe"
)
var (
rpcrt4 = windows.NewLazySystemDLL("RPCRT4.dll")
procRpcServerInqBindingHandle = rpcrt4.NewProc("RpcServerInqBindingHandle")
)
// Binding (void** out)
r1, _, err := procRpcServerInqBindingHandle.Call(
uintptr(Binding),
)
_ = err // syscall.Errno (valid when the call sets last-error)
_ = r1 // RPC_STATUSfunction RpcServerInqBindingHandle(
Binding: Pointer // void** out
): Integer; stdcall;
external 'RPCRT4.dll' name 'RpcServerInqBindingHandle';result := DllCall("RPCRT4\RpcServerInqBindingHandle"
, "Ptr", Binding ; void** out
, "Int") ; return: RPC_STATUS●RpcServerInqBindingHandle(Binding) = DLL("RPCRT4.dll", "int RpcServerInqBindingHandle(void*)")
# 呼び出し: RpcServerInqBindingHandle(Binding)
# Binding : void** out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。const std = @import("std");
extern "rpcrt4" fn RpcServerInqBindingHandle(
Binding: ?*anyopaque // void** out
) callconv(std.os.windows.WINAPI) i32;proc RpcServerInqBindingHandle(
Binding: pointer # void** out
): int32 {.importc: "RpcServerInqBindingHandle", stdcall, dynlib: "RPCRT4.dll".}pragma(lib, "rpcrt4");
extern(Windows)
int RpcServerInqBindingHandle(
void** Binding // void** out
);ccall((:RpcServerInqBindingHandle, "RPCRT4.dll"), stdcall, Int32,
(Ptr{Cvoid},),
Binding)
# Binding : void** out -> Ptr{Cvoid}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。local ffi = require("ffi")
ffi.cdef[[
int32_t RpcServerInqBindingHandle(
void** Binding);
]]
local rpcrt4 = ffi.load("rpcrt4")
-- rpcrt4.RpcServerInqBindingHandle(Binding)
-- Binding : void** out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。const koffi = require('koffi');
const lib = koffi.load('RPCRT4.dll');
const RpcServerInqBindingHandle = lib.func('__stdcall', 'RpcServerInqBindingHandle', 'int32_t', ['void *']);
// RpcServerInqBindingHandle(Binding)
// Binding : void** out -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。const lib = Deno.dlopen("RPCRT4.dll", {
RpcServerInqBindingHandle: { parameters: ["pointer"], result: "i32" },
});
// lib.symbols.RpcServerInqBindingHandle(Binding)
// Binding : void** out -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。<?php
$ffi = FFI::cdef(<<<C
int32_t RpcServerInqBindingHandle(
void** Binding);
C, "RPCRT4.dll");
// $ffi->RpcServerInqBindingHandle(Binding);
// Binding : void** 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 Rpcrt4 extends StdCallLibrary {
Rpcrt4 INSTANCE = Native.load("rpcrt4", Rpcrt4.class);
int RpcServerInqBindingHandle(
Pointer Binding // void** out
);
}@[Link("rpcrt4")]
lib LibRPCRT4
fun RpcServerInqBindingHandle = RpcServerInqBindingHandle(
Binding : Void** # void** out
) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。import 'dart:ffi';
import 'package:ffi/ffi.dart';
typedef RpcServerInqBindingHandleNative = Int32 Function(Pointer<Void>);
typedef RpcServerInqBindingHandleDart = int Function(Pointer<Void>);
final RpcServerInqBindingHandle = DynamicLibrary.open('RPCRT4.dll')
.lookupFunction<RpcServerInqBindingHandleNative, RpcServerInqBindingHandleDart>('RpcServerInqBindingHandle');
// Binding : void** out -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。{$mode objfpc}{$H+}
function RpcServerInqBindingHandle(
Binding: Pointer // void** out
): Integer; stdcall;
external 'RPCRT4.dll' name 'RpcServerInqBindingHandle';import Foreign
import Foreign.C.Types
import Foreign.C.String
foreign import stdcall safe "RpcServerInqBindingHandle"
c_RpcServerInqBindingHandle :: Ptr () -> IO Int32
-- Binding : void** out -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。open Ctypes
open Foreign
let rpcserverinqbindinghandle =
foreign "RpcServerInqBindingHandle"
((ptr void) @-> returning int32_t)
(* Binding : void** out -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)(cffi:define-foreign-library rpcrt4 (t "RPCRT4.dll"))
(cffi:use-foreign-library rpcrt4)
(cffi:defcfun ("RpcServerInqBindingHandle" rpc-server-inq-binding-handle :convention :stdcall) :int32
(binding :pointer)) ; void** out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。use Win32::API;
my $RpcServerInqBindingHandle = Win32::API::More->new('RPCRT4',
'int RpcServerInqBindingHandle(LPVOID Binding)');
# my $ret = $RpcServerInqBindingHandle->Call($Binding);
# Binding : void** out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。