RpcObjectSetType
関数シグネチャ
// RPCRT4.dll
#include <windows.h>
RPC_STATUS RpcObjectSetType(
GUID* ObjUuid,
GUID* TypeUuid // optional
);パラメーター
| 名前 | 型 | 方向 | 説明 |
|---|---|---|---|
| ObjUuid | GUID* | in | TypeUuid パラメーターの型 UUID に関連付けるオブジェクト UUID へのポインター。 |
| TypeUuid | GUID* | inoptional | ObjUuid パラメーターの型 UUID へのポインター。 パラメーターの値に NULL または nil UUID を指定すると、オブジェクトの型は既定の関連付けであるオブジェクト UUID / nil 型 UUID にリセットされます。 |
戻り値の型: RPC_STATUS
公式ドキュメント
RpcObjectSetType 関数は、オブジェクトの型を割り当てます。
戻り値
| 値 | 意味 |
|---|---|
| 呼び出しに成功しました。 | |
| オブジェクトが無効です。 | |
| オブジェクトは既に登録されています。 | |
| システムのメモリが不足しています。 |
解説(Remarks)
サーバーアプリケーションは、オブジェクト UUID に型 UUID を割り当てるために RpcObjectSetType を呼び出します。既定では、RPC ランタイムライブラリはすべてのオブジェクト UUID に nil 型 UUID を自動的に割り当てます。インターフェイスの実装を 1 つだけ持つ (マネージャーエントリポイントベクター [EPV] が 1 つだけの) サーバーアプリケーションは、そのインターフェイスを nil 型 UUID で登録している場合、 RpcObjectSetType を呼び出す必要はありません ( RpcServerRegisterIf を参照)。
インターフェイスの実装を複数持つ (複数のマネージャー EPV、つまり複数の型 UUID を持つ) サーバーアプリケーションは、サポートするオブジェクト UUID と nil ではない型 UUID の関連付けごとに 1 回ずつ RpcObjectSetType を呼び出します。各オブジェクトを型 UUID に関連付けることで、nil ではないオブジェクト UUID に対するリモートプロシージャコールをサーバーが受信したときに、どのマネージャー EPV (インターフェイスの実装) を使用するかを RPC ランタイムライブラリに伝えます。
RPC ランタイムライブラリでは、アプリケーションは個数の制限なくオブジェクトに型を設定できます。( RpcObjectSetType の呼び出しによって確立された) オブジェクト UUID とその型 UUID の関連付けを解除するには、サーバーは TypeUuid パラメーターに null 値または nil UUID を指定して RpcObjectSetType を再度呼び出します。これにより、オブジェクト UUID と型 UUID の関連付けは、既定の関連付けであるオブジェクト UUID / nil 型 UUID にリセットされます。サーバーは nil オブジェクト UUID に型を割り当てることはできません。RPC ランタイムライブラリは、nil オブジェクト UUID に nil 型 UUID を自動的に割り当てます。
詳細については、 インターフェイスの登録を参照してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での呼び出し定義
// RPCRT4.dll
#include <windows.h>
RPC_STATUS RpcObjectSetType(
GUID* ObjUuid,
GUID* TypeUuid // optional
);[DllImport("RPCRT4.dll", ExactSpelling = true)]
static extern int RpcObjectSetType(
ref Guid ObjUuid, // GUID*
IntPtr TypeUuid // GUID* optional
);<DllImport("RPCRT4.dll", ExactSpelling:=True)>
Public Shared Function RpcObjectSetType(
ByRef ObjUuid As Guid, ' GUID*
TypeUuid As IntPtr ' GUID* optional
) As Integer
End Function' ObjUuid : GUID*
' TypeUuid : GUID* optional
Declare PtrSafe Function RpcObjectSetType Lib "rpcrt4" ( _
ByVal ObjUuid As LongPtr, _
ByVal TypeUuid As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。import ctypes
from ctypes import wintypes
RpcObjectSetType = ctypes.windll.rpcrt4.RpcObjectSetType
RpcObjectSetType.restype = ctypes.c_int
RpcObjectSetType.argtypes = [
ctypes.c_void_p, # ObjUuid : GUID*
ctypes.c_void_p, # TypeUuid : GUID* optional
]require 'fiddle'
require 'fiddle/import'
lib = Fiddle.dlopen('RPCRT4.dll')
RpcObjectSetType = Fiddle::Function.new(
lib['RpcObjectSetType'],
[
Fiddle::TYPE_VOIDP, # ObjUuid : GUID*
Fiddle::TYPE_VOIDP, # TypeUuid : GUID* optional
],
Fiddle::TYPE_INT)#[link(name = "rpcrt4")]
extern "system" {
fn RpcObjectSetType(
ObjUuid: *mut GUID, // GUID*
TypeUuid: *mut GUID // GUID* optional
) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.$sig = @"
[DllImport("RPCRT4.dll")]
public static extern int RpcObjectSetType(ref Guid ObjUuid, IntPtr TypeUuid);
"@
$api = Add-Type -MemberDefinition $sig -Name 'RPCRT4_RpcObjectSetType' -Namespace Win32 -PassThru
# $api::RpcObjectSetType(ObjUuid, TypeUuid)#uselib "RPCRT4.dll"
#func global RpcObjectSetType "RpcObjectSetType" sptr, sptr
; RpcObjectSetType varptr(ObjUuid), varptr(TypeUuid) ; 戻り値は stat
; ObjUuid : GUID* -> "sptr"
; TypeUuid : GUID* optional -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。#uselib "RPCRT4.dll" #cfunc global RpcObjectSetType "RpcObjectSetType" var, var ; res = RpcObjectSetType(ObjUuid, TypeUuid) ; ObjUuid : GUID* -> "var" ; TypeUuid : GUID* optional -> "var" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。#uselib "RPCRT4.dll" #cfunc global RpcObjectSetType "RpcObjectSetType" sptr, sptr ; res = RpcObjectSetType(varptr(ObjUuid), varptr(TypeUuid)) ; ObjUuid : GUID* -> "sptr" ; TypeUuid : GUID* optional -> "sptr" ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。
; RPC_STATUS RpcObjectSetType(GUID* ObjUuid, GUID* TypeUuid) #uselib "RPCRT4.dll" #cfunc global RpcObjectSetType "RpcObjectSetType" var, var ; res = RpcObjectSetType(ObjUuid, TypeUuid) ; ObjUuid : GUID* -> "var" ; TypeUuid : GUID* optional -> "var" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。; RPC_STATUS RpcObjectSetType(GUID* ObjUuid, GUID* TypeUuid) #uselib "RPCRT4.dll" #cfunc global RpcObjectSetType "RpcObjectSetType" intptr, intptr ; res = RpcObjectSetType(varptr(ObjUuid), varptr(TypeUuid)) ; ObjUuid : GUID* -> "intptr" ; TypeUuid : GUID* optional -> "intptr" ; ※出力/バッファ引数はポインタ方式(token=intptr / 呼び出しは varptr(変数))。
import (
"golang.org/x/sys/windows"
"unsafe"
)
var (
rpcrt4 = windows.NewLazySystemDLL("RPCRT4.dll")
procRpcObjectSetType = rpcrt4.NewProc("RpcObjectSetType")
)
// ObjUuid (GUID*), TypeUuid (GUID* optional)
r1, _, err := procRpcObjectSetType.Call(
uintptr(ObjUuid),
uintptr(TypeUuid),
)
_ = err // syscall.Errno (valid when the call sets last-error)
_ = r1 // RPC_STATUSfunction RpcObjectSetType(
ObjUuid: PGUID; // GUID*
TypeUuid: PGUID // GUID* optional
): Integer; stdcall;
external 'RPCRT4.dll' name 'RpcObjectSetType';result := DllCall("RPCRT4\RpcObjectSetType"
, "Ptr", ObjUuid ; GUID*
, "Ptr", TypeUuid ; GUID* optional
, "Int") ; return: RPC_STATUS●RpcObjectSetType(ObjUuid, TypeUuid) = DLL("RPCRT4.dll", "int RpcObjectSetType(void*, void*)")
# 呼び出し: RpcObjectSetType(ObjUuid, TypeUuid)
# ObjUuid : GUID* -> "void*"
# TypeUuid : GUID* optional -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。const std = @import("std");
extern "rpcrt4" fn RpcObjectSetType(
ObjUuid: [*c]GUID, // GUID*
TypeUuid: [*c]GUID // GUID* optional
) callconv(std.os.windows.WINAPI) i32;proc RpcObjectSetType(
ObjUuid: ptr GUID, # GUID*
TypeUuid: ptr GUID # GUID* optional
): int32 {.importc: "RpcObjectSetType", stdcall, dynlib: "RPCRT4.dll".}pragma(lib, "rpcrt4");
extern(Windows)
int RpcObjectSetType(
GUID* ObjUuid, // GUID*
GUID* TypeUuid // GUID* optional
);ccall((:RpcObjectSetType, "RPCRT4.dll"), stdcall, Int32,
(Ptr{GUID}, Ptr{GUID}),
ObjUuid, TypeUuid)
# ObjUuid : GUID* -> Ptr{GUID}
# TypeUuid : GUID* optional -> Ptr{GUID}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。local ffi = require("ffi")
ffi.cdef[[
int32_t RpcObjectSetType(
void* ObjUuid,
void* TypeUuid);
]]
local rpcrt4 = ffi.load("rpcrt4")
-- rpcrt4.RpcObjectSetType(ObjUuid, TypeUuid)
-- ObjUuid : GUID*
-- TypeUuid : GUID* optional
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。const koffi = require('koffi');
const lib = koffi.load('RPCRT4.dll');
const RpcObjectSetType = lib.func('__stdcall', 'RpcObjectSetType', 'int32_t', ['void *', 'void *']);
// RpcObjectSetType(ObjUuid, TypeUuid)
// ObjUuid : GUID* -> 'void *'
// TypeUuid : GUID* optional -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。const lib = Deno.dlopen("RPCRT4.dll", {
RpcObjectSetType: { parameters: ["pointer", "pointer"], result: "i32" },
});
// lib.symbols.RpcObjectSetType(ObjUuid, TypeUuid)
// ObjUuid : GUID* -> "pointer"
// TypeUuid : GUID* optional -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。<?php
$ffi = FFI::cdef(<<<C
int32_t RpcObjectSetType(
void* ObjUuid,
void* TypeUuid);
C, "RPCRT4.dll");
// $ffi->RpcObjectSetType(ObjUuid, TypeUuid);
// ObjUuid : GUID*
// TypeUuid : GUID* optional
// 構造体/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 RpcObjectSetType(
Pointer ObjUuid, // GUID*
Pointer TypeUuid // GUID* optional
);
}@[Link("rpcrt4")]
lib LibRPCRT4
fun RpcObjectSetType = RpcObjectSetType(
ObjUuid : GUID*, # GUID*
TypeUuid : GUID* # GUID* optional
) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。import 'dart:ffi';
import 'package:ffi/ffi.dart';
typedef RpcObjectSetTypeNative = Int32 Function(Pointer<Void>, Pointer<Void>);
typedef RpcObjectSetTypeDart = int Function(Pointer<Void>, Pointer<Void>);
final RpcObjectSetType = DynamicLibrary.open('RPCRT4.dll')
.lookupFunction<RpcObjectSetTypeNative, RpcObjectSetTypeDart>('RpcObjectSetType');
// ObjUuid : GUID* -> Pointer<Void>
// TypeUuid : GUID* optional -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。{$mode objfpc}{$H+}
function RpcObjectSetType(
ObjUuid: PGUID; // GUID*
TypeUuid: PGUID // GUID* optional
): Integer; stdcall;
external 'RPCRT4.dll' name 'RpcObjectSetType';import Foreign
import Foreign.C.Types
import Foreign.C.String
foreign import stdcall safe "RpcObjectSetType"
c_RpcObjectSetType :: Ptr () -> Ptr () -> IO Int32
-- ObjUuid : GUID* -> Ptr ()
-- TypeUuid : GUID* optional -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。open Ctypes
open Foreign
let rpcobjectsettype =
foreign "RpcObjectSetType"
((ptr void) @-> (ptr void) @-> returning int32_t)
(* ObjUuid : GUID* -> (ptr void) *)
(* TypeUuid : GUID* optional -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)(cffi:define-foreign-library rpcrt4 (t "RPCRT4.dll"))
(cffi:use-foreign-library rpcrt4)
(cffi:defcfun ("RpcObjectSetType" rpc-object-set-type :convention :stdcall) :int32
(obj-uuid :pointer) ; GUID*
(type-uuid :pointer)) ; GUID* optional
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。use Win32::API;
my $RpcObjectSetType = Win32::API::More->new('RPCRT4',
'int RpcObjectSetType(LPVOID ObjUuid, LPVOID TypeUuid)');
# my $ret = $RpcObjectSetType->Call($ObjUuid, $TypeUuid);
# ObjUuid : GUID* -> LPVOID
# TypeUuid : GUID* optional -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。関連項目
- f RpcServerRegisterIf — RPCサーバーにインターフェイスを登録する。