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

RpcServerUseAllProtseqsIf

関数
インターフェイス指定で全プロトコルシーケンスを登録する。
DLLRPCRT4.dll呼出規約winapi対応OSWindows 2000 以降

シグネチャ

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

RPC_STATUS RpcServerUseAllProtseqsIf(
    DWORD MaxCalls,
    void* IfSpec,
    void* SecurityDescriptor   // optional
);

パラメーター

名前方向説明
MaxCallsDWORDinncacn_ip_tcp プロトコル シーケンスのバックログ キューの長さ。他のすべてのプロトコル シーケンスでは、このパラメーターは無視されます。既定値を指定するには RPC_C_PROTSEQ_MAX_REQS_DEFAULT を使用します。「解説」を参照してください。
IfSpecvoid*inバインディング ハンドルの作成に使用するプロトコル シーケンスと、対応するエンドポイント情報を含むインターフェイス。
SecurityDescriptorvoid*inoptionalセキュリティ サブシステム用に提供される省略可能なパラメーターへのポインター。ncacn_np および ncalrpc プロトコル シーケンスでのみ使用されます。他のすべてのプロトコル シーケンスでは、このパラメーターは無視されます。サーバーをセキュリティで保護する目的でエンドポイントにセキュリティ記述子を使用することは推奨されません。このパラメーターは、この API の DCE 仕様には存在しません。

戻り値の型: RPC_STATUS

公式ドキュメント

RpcServerUseAllProtseqsIf 関数は、リモート プロシージャ コールを受信するために、インターフェイス仕様で指定されたすべてのプロトコル シーケンスとエンドポイントを使用するよう、RPC ランタイム ライブラリに指示します。

戻り値

意味
RPC_S_OK
呼び出しに成功しました。
RPC_S_NO_PROTSEQS
サポートされているプロトコル シーケンスがありません。
RPC_S_INVALID_ENDPOINT_FORMAT
エンドポイントの形式が無効です。
RPC_S_OUT_OF_MEMORY
システムのメモリが不足しています。
RPC_S_DUPLICATE_ENDPOINT
エンドポイントが重複しています。
RPC_S_INVALID_SECURITY_DESC
セキュリティ記述子が無効です。
RPC_S_INVALID_RPC_PROTSEQ
RPC プロトコル シーケンスが無効です。
注意 有効なエラー コードの一覧については、 RPC の戻り値を参照してください。

解説(Remarks)

注意 サポートされているすべてのプロトコル シーケンスでリッスンすることは推奨されません。主流ではないプロトコル シーケンスも含め、すべてのプロトコル シーケンスでサーバーがリッスンすることになるためです。サーバーは主流のプロトコル シーケンスのみでリッスンすることを推奨します。
サーバー アプリケーションは RpcServerUseAllProtseqsIf を呼び出して、IDL ファイルで指定されたすべてのプロトコル シーケンスと、それに関連付けられたエンドポイント アドレス情報を RPC ランタイム ライブラリに登録します。RPC がサポートするプロトコル シーケンスの一覧については、 文字列バインディングを参照してください。

リモート プロシージャ コールの要求を受信するには、サーバーは少なくとも 1 つのプロトコル シーケンスを RPC ランタイム ライブラリに登録する必要があります。サーバーが登録したプロトコル シーケンスごとに、RPC ランタイム ライブラリは、サーバーがリモート プロシージャ コールの要求を受信するためのエンドポイントを 1 つ以上作成します。RPC ランタイム ライブラリは、プロトコル シーケンスごとに異なるエンドポイントを作成します。

注意 RpcServerUseAllProtseqsIf 関数を使用しても、サーバーは次のプロトコル シーケンスではリッスンしません。
注意 これらのプロトコル シーケンスでリッスンするには、各シーケンスを個別に選択する必要があります。
MaxCalls については、アプリケーションが指定する値はあくまでヒントです。RPC ランタイムまたは Windows ソケット プロバイダーが、この値を上書きすることがあります。たとえば Windows XP または Windows 2000 Professional では、値は 5 に制限されます。5 より大きい値は無視され、代わりに 5 が使用されます。Windows Server 2003 および Windows 2000 Server では、指定した値がそのまま使用されます。

アプリケーションは、MaxCalls に妥当な値を渡すよう注意する必要があります。Server、Advanced Server、または Datacenter Server で大きな値を指定すると、非ページ プール メモリが大量に使用される可能性があります。値が小さすぎることも好ましくありません。バックログ キューが枯渇すると、TCP SYN パケットに対してサーバーから TCP RST が返される可能性があるためです。アプリケーション開発者は、MaxCalls の適切な値を決定する際に、メモリ使用量とスケーラビリティの要件のバランスを取る必要があります。

コンピューターが選択的バインディングを使用するよう構成されている場合、この関数が成功しても、コンピューター上に存在するすべてのネットワーク インターフェイスに対してサーバーがエンドポイントを作成したことは保証されません。選択的バインディングの設定によっては、RPC ランタイムが一部のネットワーク インターフェイスでリッスンしないことがあります。さらに、インターフェイスが DHCP による IP アドレスをまだ受け取っていない場合、RPC サーバーは、DHCP アドレスが割り当てられるまでそのネットワーク インターフェイスでリッスンしません。この関数が成功した場合、サーバーが少なくとも 1 つのネットワーク インターフェイスでリッスンしていることを意味します。リモート プロシージャ コールを受信できるバインディング ハンドルの完全な一覧は、RpcServerInqBindings 関数を呼び出すことで取得できます。

詳細については、 サーバー側のバインディングを参照してください。IDL ファイルで指定されたプロトコル シーケンスのうち、選択したものだけを登録するには、サーバーは RpcServerUseProtseqIf を呼び出します。

出典・ライセンス: 上記「公式ドキュメント」の内容は 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 RpcServerUseAllProtseqsIf(
    DWORD MaxCalls,
    void* IfSpec,
    void* SecurityDescriptor   // optional
);
[DllImport("RPCRT4.dll", ExactSpelling = true)]
static extern int RpcServerUseAllProtseqsIf(
    uint MaxCalls,   // DWORD
    IntPtr IfSpec,   // void*
    IntPtr SecurityDescriptor   // void* optional
);
<DllImport("RPCRT4.dll", ExactSpelling:=True)>
Public Shared Function RpcServerUseAllProtseqsIf(
    MaxCalls As UInteger,   ' DWORD
    IfSpec As IntPtr,   ' void*
    SecurityDescriptor As IntPtr   ' void* optional
) As Integer
End Function
' MaxCalls : DWORD
' IfSpec : void*
' SecurityDescriptor : void* optional
Declare PtrSafe Function RpcServerUseAllProtseqsIf Lib "rpcrt4" ( _
    ByVal MaxCalls As Long, _
    ByVal IfSpec As LongPtr, _
    ByVal SecurityDescriptor As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

RpcServerUseAllProtseqsIf = ctypes.windll.rpcrt4.RpcServerUseAllProtseqsIf
RpcServerUseAllProtseqsIf.restype = ctypes.c_int
RpcServerUseAllProtseqsIf.argtypes = [
    wintypes.DWORD,  # MaxCalls : DWORD
    ctypes.POINTER(None),  # IfSpec : void*
    ctypes.POINTER(None),  # SecurityDescriptor : void* optional
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('RPCRT4.dll')
RpcServerUseAllProtseqsIf = Fiddle::Function.new(
  lib['RpcServerUseAllProtseqsIf'],
  [
    -Fiddle::TYPE_INT,  # MaxCalls : DWORD
    Fiddle::TYPE_VOIDP,  # IfSpec : void*
    Fiddle::TYPE_VOIDP,  # SecurityDescriptor : void* optional
  ],
  Fiddle::TYPE_INT)
#[link(name = "rpcrt4")]
extern "system" {
    fn RpcServerUseAllProtseqsIf(
        MaxCalls: u32,  // DWORD
        IfSpec: *mut (),  // void*
        SecurityDescriptor: *mut ()  // void* optional
    ) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("RPCRT4.dll")]
public static extern int RpcServerUseAllProtseqsIf(uint MaxCalls, IntPtr IfSpec, IntPtr SecurityDescriptor);
"@
$api = Add-Type -MemberDefinition $sig -Name 'RPCRT4_RpcServerUseAllProtseqsIf' -Namespace Win32 -PassThru
# $api::RpcServerUseAllProtseqsIf(MaxCalls, IfSpec, SecurityDescriptor)
#uselib "RPCRT4.dll"
#func global RpcServerUseAllProtseqsIf "RpcServerUseAllProtseqsIf" sptr, sptr, sptr
; RpcServerUseAllProtseqsIf MaxCalls, IfSpec, SecurityDescriptor   ; 戻り値は stat
; MaxCalls : DWORD -> "sptr"
; IfSpec : void* -> "sptr"
; SecurityDescriptor : void* optional -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
#uselib "RPCRT4.dll"
#cfunc global RpcServerUseAllProtseqsIf "RpcServerUseAllProtseqsIf" int, sptr, sptr
; res = RpcServerUseAllProtseqsIf(MaxCalls, IfSpec, SecurityDescriptor)
; MaxCalls : DWORD -> "int"
; IfSpec : void* -> "sptr"
; SecurityDescriptor : void* optional -> "sptr"
; RPC_STATUS RpcServerUseAllProtseqsIf(DWORD MaxCalls, void* IfSpec, void* SecurityDescriptor)
#uselib "RPCRT4.dll"
#cfunc global RpcServerUseAllProtseqsIf "RpcServerUseAllProtseqsIf" int, intptr, intptr
; res = RpcServerUseAllProtseqsIf(MaxCalls, IfSpec, SecurityDescriptor)
; MaxCalls : DWORD -> "int"
; IfSpec : void* -> "intptr"
; SecurityDescriptor : void* optional -> "intptr"
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	rpcrt4 = windows.NewLazySystemDLL("RPCRT4.dll")
	procRpcServerUseAllProtseqsIf = rpcrt4.NewProc("RpcServerUseAllProtseqsIf")
)

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

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

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

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

let rpcserveruseallprotseqsif =
  foreign "RpcServerUseAllProtseqsIf"
    (uint32_t @-> (ptr void) @-> (ptr void) @-> returning int32_t)
(* MaxCalls : DWORD -> uint32_t *)
(* IfSpec : void* -> (ptr void) *)
(* SecurityDescriptor : void* 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 ("RpcServerUseAllProtseqsIf" rpc-server-use-all-protseqs-if :convention :stdcall) :int32
  (max-calls :uint32)   ; DWORD
  (if-spec :pointer)   ; void*
  (security-descriptor :pointer))   ; void* optional
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $RpcServerUseAllProtseqsIf = Win32::API::More->new('RPCRT4',
    'int RpcServerUseAllProtseqsIf(DWORD MaxCalls, LPVOID IfSpec, LPVOID SecurityDescriptor)');
# my $ret = $RpcServerUseAllProtseqsIf->Call($MaxCalls, $IfSpec, $SecurityDescriptor);
# MaxCalls : DWORD -> DWORD
# IfSpec : void* -> LPVOID
# SecurityDescriptor : void* optional -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

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