Win32 API 日本語リファレンス
ホームSystem.Rpc › RpcServerUnregisterIf

RpcServerUnregisterIf

関数
登録済みインターフェイスの登録を解除する。
DLLRPCRT4.dll呼出規約winapi対応OSWindows 2000 以降

シグネチャ

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

RPC_STATUS RpcServerUnregisterIf(
    void* IfSpec,   // optional
    GUID* MgrTypeUuid,   // optional
    DWORD WaitForCallsToComplete
);

パラメーター

名前方向説明
IfSpecvoid*inoptional

レジストリから削除するインターフェイス。

MgrTypeUuid パラメーターで指定した型 UUID 値で以前に登録されたすべてのインターフェイスを削除するには、null 値を指定します。

MgrTypeUuidGUID*inoptional

レジストリから削除するマネージャー エントリ ポイント ベクター (EPV) の型 UUID へのポインター。MgrTypeUuid の値は、 RpcServerRegisterIf 関数、RpcServerRegisterIf2 関数、または RpcServerRegisterIfEx 関数の呼び出しで指定した値と同じである必要があります。

以前に登録されたすべての型 UUID について、IfSpec パラメーターで指定したインターフェイスをレジストリから削除するには、null 値を指定します。

MIDL によって生成された既定のマネージャー EPV をレジストリから削除するには、nil UUID を指定します。この場合、nil 以外の型 UUID で登録されたマネージャー EPV はすべて登録されたまま残ります。

WaitForCallsToCompleteDWORDin

インターフェイスを直ちにレジストリから削除するか、現在のすべての呼び出しが完了するまで待機するかを示すフラグ。

実行中の呼び出しを考慮せずにインターフェイスを直ちにレジストリから削除するには、値 0 を指定します。アクティブな呼び出しがすべて完了するまで待機するには、0 以外の任意の値を指定します。

戻り値の型: RPC_STATUS

公式ドキュメント

RpcServerUnregisterIf 関数は、RPC ランタイム ライブラリのレジストリからインターフェイスを削除します。

戻り値

意味
RPC_S_OK
呼び出しに成功しました。
RPC_S_UNKNOWN_MGR_TYPE
マネージャーの型が不明です。
RPC_S_UNKNOWN_IF
インターフェイスが不明です。
有効なエラー コードの一覧については、 RPC の戻り値を参照してください。

解説(Remarks)

サーバーは、インターフェイスとマネージャー EPV の関連付けを解除するために RpcServerUnregisterIf を呼び出します。削除するマネージャー EPV を MgrTypeUuid パラメーターで指定するには、 RpcServerRegisterIf の呼び出しで指定した型 UUID 値を渡します。レジストリから削除されたインターフェイスは、クライアント アプリケーションから利用できなくなります。

インターフェイスがレジストリから削除されると、RPC ランタイム ライブラリはそのインターフェイスに対する新しい呼び出しの受け付けを停止します。そのインターフェイスで現在実行中の呼び出しは、コールバックを含めて完了することが許可されます。

次の表は、 RpcServerUnregisterIf の動作をまとめたものです。

IfSpec MgrTypeUuid 動作
null 以外 null 以外 指定されたパラメーターに関連付けられたマネージャー EPV をレジストリから削除します。
null 以外 NULL IfSpec パラメーターに関連付けられたすべてのマネージャー EPV を削除します。
NULL null 以外 MgrTypeUuid パラメーターに関連付けられたすべてのマネージャー EPV を削除します。
NULL NULL すべてのマネージャー EPV を削除します。この呼び出しにより、すべてのインターフェイスのすべてのマネージャー EPV が登録解除されるため、サーバーは新しいリモート プロシージャ コールを受信できなくなります。
IfSpec の値が NULL の場合、この関数は 自動リッスン (auto-listen) インターフェイスを登録されたまま残します。自動リッスン (auto-listen) インターフェイスは、個別にレジストリから削除する必要があります。詳細については、 RpcServerRegisterIfEx を参照してください。
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での呼び出し定義

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

RPC_STATUS RpcServerUnregisterIf(
    void* IfSpec,   // optional
    GUID* MgrTypeUuid,   // optional
    DWORD WaitForCallsToComplete
);
[DllImport("RPCRT4.dll", ExactSpelling = true)]
static extern int RpcServerUnregisterIf(
    IntPtr IfSpec,   // void* optional
    IntPtr MgrTypeUuid,   // GUID* optional
    uint WaitForCallsToComplete   // DWORD
);
<DllImport("RPCRT4.dll", ExactSpelling:=True)>
Public Shared Function RpcServerUnregisterIf(
    IfSpec As IntPtr,   ' void* optional
    MgrTypeUuid As IntPtr,   ' GUID* optional
    WaitForCallsToComplete As UInteger   ' DWORD
) As Integer
End Function
' IfSpec : void* optional
' MgrTypeUuid : GUID* optional
' WaitForCallsToComplete : DWORD
Declare PtrSafe Function RpcServerUnregisterIf Lib "rpcrt4" ( _
    ByVal IfSpec As LongPtr, _
    ByVal MgrTypeUuid As LongPtr, _
    ByVal WaitForCallsToComplete As Long) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

RpcServerUnregisterIf = ctypes.windll.rpcrt4.RpcServerUnregisterIf
RpcServerUnregisterIf.restype = ctypes.c_int
RpcServerUnregisterIf.argtypes = [
    ctypes.POINTER(None),  # IfSpec : void* optional
    ctypes.c_void_p,  # MgrTypeUuid : GUID* optional
    wintypes.DWORD,  # WaitForCallsToComplete : DWORD
]
require 'fiddle'
require 'fiddle/import'

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

var (
	rpcrt4 = windows.NewLazySystemDLL("RPCRT4.dll")
	procRpcServerUnregisterIf = rpcrt4.NewProc("RpcServerUnregisterIf")
)

// IfSpec (void* optional), MgrTypeUuid (GUID* optional), WaitForCallsToComplete (DWORD)
r1, _, err := procRpcServerUnregisterIf.Call(
	uintptr(IfSpec),
	uintptr(MgrTypeUuid),
	uintptr(WaitForCallsToComplete),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // RPC_STATUS
function RpcServerUnregisterIf(
  IfSpec: Pointer;   // void* optional
  MgrTypeUuid: PGUID;   // GUID* optional
  WaitForCallsToComplete: DWORD   // DWORD
): Integer; stdcall;
  external 'RPCRT4.dll' name 'RpcServerUnregisterIf';
result := DllCall("RPCRT4\RpcServerUnregisterIf"
    , "Ptr", IfSpec   ; void* optional
    , "Ptr", MgrTypeUuid   ; GUID* optional
    , "UInt", WaitForCallsToComplete   ; DWORD
    , "Int")   ; return: RPC_STATUS
●RpcServerUnregisterIf(IfSpec, MgrTypeUuid, WaitForCallsToComplete) = DLL("RPCRT4.dll", "int RpcServerUnregisterIf(void*, void*, dword)")
# 呼び出し: RpcServerUnregisterIf(IfSpec, MgrTypeUuid, WaitForCallsToComplete)
# IfSpec : void* optional -> "void*"
# MgrTypeUuid : GUID* optional -> "void*"
# WaitForCallsToComplete : DWORD -> "dword"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

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

typedef RpcServerUnregisterIfNative = Int32 Function(Pointer<Void>, Pointer<Void>, Uint32);
typedef RpcServerUnregisterIfDart = int Function(Pointer<Void>, Pointer<Void>, int);
final RpcServerUnregisterIf = DynamicLibrary.open('RPCRT4.dll')
    .lookupFunction<RpcServerUnregisterIfNative, RpcServerUnregisterIfDart>('RpcServerUnregisterIf');
// IfSpec : void* optional -> Pointer<Void>
// MgrTypeUuid : GUID* optional -> Pointer<Void>
// WaitForCallsToComplete : DWORD -> Uint32
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function RpcServerUnregisterIf(
  IfSpec: Pointer;   // void* optional
  MgrTypeUuid: PGUID;   // GUID* optional
  WaitForCallsToComplete: DWORD   // DWORD
): Integer; stdcall;
  external 'RPCRT4.dll' name 'RpcServerUnregisterIf';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "RpcServerUnregisterIf"
  c_RpcServerUnregisterIf :: Ptr () -> Ptr () -> Word32 -> IO Int32
-- IfSpec : void* optional -> Ptr ()
-- MgrTypeUuid : GUID* optional -> Ptr ()
-- WaitForCallsToComplete : DWORD -> Word32
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let rpcserverunregisterif =
  foreign "RpcServerUnregisterIf"
    ((ptr void) @-> (ptr void) @-> uint32_t @-> returning int32_t)
(* IfSpec : void* optional -> (ptr void) *)
(* MgrTypeUuid : GUID* optional -> (ptr void) *)
(* WaitForCallsToComplete : DWORD -> uint32_t *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library rpcrt4 (t "RPCRT4.dll"))
(cffi:use-foreign-library rpcrt4)

(cffi:defcfun ("RpcServerUnregisterIf" rpc-server-unregister-if :convention :stdcall) :int32
  (if-spec :pointer)   ; void* optional
  (mgr-type-uuid :pointer)   ; GUID* optional
  (wait-for-calls-to-complete :uint32))   ; DWORD
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $RpcServerUnregisterIf = Win32::API::More->new('RPCRT4',
    'int RpcServerUnregisterIf(LPVOID IfSpec, LPVOID MgrTypeUuid, DWORD WaitForCallsToComplete)');
# my $ret = $RpcServerUnregisterIf->Call($IfSpec, $MgrTypeUuid, $WaitForCallsToComplete);
# IfSpec : void* optional -> LPVOID
# MgrTypeUuid : GUID* optional -> LPVOID
# WaitForCallsToComplete : DWORD -> DWORD
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

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