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

RpcNsBindingExportPnPA

関数
プラグアンドプレイ対応でネームサービスにバインディングをエクスポートする(ANSI版)。
DLLRPCNS4.dll文字セットANSI (-A)呼出規約winapi対応OSWindows 2000 以降

シグネチャ

// RPCNS4.dll  (ANSI / -A)
#include <windows.h>

RPC_STATUS RpcNsBindingExportPnPA(
    DWORD EntryNameSyntax,
    LPSTR EntryName,   // optional
    void* IfSpec,   // optional
    UUID_VECTOR* ObjectVector   // optional
);

パラメーター

名前方向説明
EntryNameSyntaxDWORDin

EntryName の構文。

レジストリの値エントリ HKEY_LOCAL_MACHINE\Software\Microsoft\Rpc\NameService\DefaultSyntax で指定された構文を使用するには、RPC_C_NS_SYNTAX_DEFAULT を指定します。

EntryNameLPSTRinoptional

バインディング ハンドルとオブジェクト UUID のエクスポート先となるエントリ名へのポインター。null または空の文字列を指定することはできません。

レジストリの値エントリ HKEY_LOCAL_MACHINE\Software\Microsoft\Rpc\NameService\DefaultEntry で指定されたエントリ名を使用するには、null ポインターまたは空の文字列を指定します。この場合、EntryNameSyntax パラメーターは無視され、ランタイム ライブラリは既定の構文を使用します。

IfSpecvoid*inoptionalエクスポートするインターフェイスを指定する、スタブが生成したデータ構造。null 値は、エクスポートするバインディング ハンドルが存在しないこと (オブジェクト UUID のみをエクスポートすること) を示し、BindingVec は無視されます。
ObjectVectorUUID_VECTOR*inoptionalサーバーが提供するオブジェクト UUID のベクターへのポインター。このベクターはサーバー アプリケーションが構築します。null 値は、エクスポートするオブジェクト UUID が存在しないこと (バインディング ハンドルのみをエクスポートすること) を示します。

戻り値の型: RPC_STATUS

公式ドキュメント

RpcNsBindingExportPnP 関数は、プラグ アンド プレイをサポートするサーバー向けに、複数のバインディング ハンドルと複数のオブジェクトを持つネーム サービス データベースのエントリを確立します。(ANSI)

戻り値

意味
RPC_S_OK
呼び出しに成功しました。
RPC_S_NOTHING_TO_EXPORT
エクスポートするものがありませんでした。
RPC_S_INVALID_BINDING
バインディング ハンドルが無効でした。
RPC_S_WRONG_KIND_OF_BINDING
この操作には不適切な種類のバインディングでした。
RPC_S_INVALID_NAME_SYNTAX
名前の構文が無効です。
RPC_S_UNSUPPORTED_NAME_SYNTAX
名前の構文がサポートされていません。
RPC_S_INCOMPLETE_NAME
名前が不完全です。
RPC_S_NO_NS_PRIVILEGE
ネーム サービス操作の特権がありません。
RPC_S_NAME_SERVICE_UNAVAILABLE
ネーム サービスを利用できません。
メモ 有効なエラー コードの一覧については、 RPC Return Values を参照してください。

解説(Remarks)

RpcNsBindingExportPnP 関数を使用すると、サーバー アプリケーションは、任意のクライアント アプリケーションが使用できるプラグ アンド プレイ バインディングをサポートするインターフェイスを、ネーム サービス データベースで公開できます。

プラグ アンド プレイ バインディングをエクスポートするとき、サーバー アプリケーションはバインディング ベクターを明示的に指定しないでください。プラグ アンド プレイ イベントによってバインディングが変化した場合、バインディングは自動的に更新されます。

メモ

rpcnsi.h ヘッダーは、RpcNsBindingExportPnP を、UNICODE プリプロセッサ定数の定義に基づいてこの関数の ANSI 版または Unicode 版を自動的に選択するエイリアスとして定義します。エンコードに依存しないエイリアスの使用と、エンコードに依存するコードを混在させると、不一致が生じ、コンパイル エラーまたは実行時エラーの原因となる可能性があります。詳細については、Conventions for Function Prototypes を参照してください。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での呼び出し定義

// RPCNS4.dll  (ANSI / -A)
#include <windows.h>

RPC_STATUS RpcNsBindingExportPnPA(
    DWORD EntryNameSyntax,
    LPSTR EntryName,   // optional
    void* IfSpec,   // optional
    UUID_VECTOR* ObjectVector   // optional
);
[DllImport("RPCNS4.dll", CharSet = CharSet.Ansi, ExactSpelling = true)]
static extern int RpcNsBindingExportPnPA(
    uint EntryNameSyntax,   // DWORD
    [MarshalAs(UnmanagedType.LPStr)] string EntryName,   // LPSTR optional
    IntPtr IfSpec,   // void* optional
    IntPtr ObjectVector   // UUID_VECTOR* optional
);
<DllImport("RPCNS4.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True)>
Public Shared Function RpcNsBindingExportPnPA(
    EntryNameSyntax As UInteger,   ' DWORD
    <MarshalAs(UnmanagedType.LPStr)> EntryName As String,   ' LPSTR optional
    IfSpec As IntPtr,   ' void* optional
    ObjectVector As IntPtr   ' UUID_VECTOR* optional
) As Integer
End Function
' EntryNameSyntax : DWORD
' EntryName : LPSTR optional
' IfSpec : void* optional
' ObjectVector : UUID_VECTOR* optional
Declare PtrSafe Function RpcNsBindingExportPnPA Lib "rpcns4" ( _
    ByVal EntryNameSyntax As Long, _
    ByVal EntryName As String, _
    ByVal IfSpec As LongPtr, _
    ByVal ObjectVector As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

RpcNsBindingExportPnPA = ctypes.windll.rpcns4.RpcNsBindingExportPnPA
RpcNsBindingExportPnPA.restype = ctypes.c_int
RpcNsBindingExportPnPA.argtypes = [
    wintypes.DWORD,  # EntryNameSyntax : DWORD
    wintypes.LPCSTR,  # EntryName : LPSTR optional
    ctypes.POINTER(None),  # IfSpec : void* optional
    ctypes.c_void_p,  # ObjectVector : UUID_VECTOR* optional
]
require 'fiddle'
require 'fiddle/import'

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

var (
	rpcns4 = windows.NewLazySystemDLL("RPCNS4.dll")
	procRpcNsBindingExportPnPA = rpcns4.NewProc("RpcNsBindingExportPnPA")
)

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

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

typedef RpcNsBindingExportPnPANative = Int32 Function(Uint32, Pointer<Utf8>, Pointer<Void>, Pointer<Void>);
typedef RpcNsBindingExportPnPADart = int Function(int, Pointer<Utf8>, Pointer<Void>, Pointer<Void>);
final RpcNsBindingExportPnPA = DynamicLibrary.open('RPCNS4.dll')
    .lookupFunction<RpcNsBindingExportPnPANative, RpcNsBindingExportPnPADart>('RpcNsBindingExportPnPA');
// EntryNameSyntax : DWORD -> Uint32
// EntryName : LPSTR optional -> Pointer<Utf8>
// IfSpec : void* optional -> Pointer<Void>
// ObjectVector : UUID_VECTOR* optional -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function RpcNsBindingExportPnPA(
  EntryNameSyntax: DWORD;   // DWORD
  EntryName: PAnsiChar;   // LPSTR optional
  IfSpec: Pointer;   // void* optional
  ObjectVector: Pointer   // UUID_VECTOR* optional
): Integer; stdcall;
  external 'RPCNS4.dll' name 'RpcNsBindingExportPnPA';
import Foreign
import Foreign.C.Types
import Foreign.C.String

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

let rpcnsbindingexportpnpa =
  foreign "RpcNsBindingExportPnPA"
    (uint32_t @-> string @-> (ptr void) @-> (ptr void) @-> returning int32_t)
(* EntryNameSyntax : DWORD -> uint32_t *)
(* EntryName : LPSTR optional -> string *)
(* IfSpec : void* optional -> (ptr void) *)
(* ObjectVector : UUID_VECTOR* optional -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library rpcns4 (t "RPCNS4.dll"))
(cffi:use-foreign-library rpcns4)

(cffi:defcfun ("RpcNsBindingExportPnPA" rpc-ns-binding-export-pn-pa :convention :stdcall) :int32
  (entry-name-syntax :uint32)   ; DWORD
  (entry-name :string)   ; LPSTR optional
  (if-spec :pointer)   ; void* optional
  (object-vector :pointer))   ; UUID_VECTOR* optional
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $RpcNsBindingExportPnPA = Win32::API::More->new('RPCNS4',
    'int RpcNsBindingExportPnPA(DWORD EntryNameSyntax, LPCSTR EntryName, LPVOID IfSpec, LPVOID ObjectVector)');
# my $ret = $RpcNsBindingExportPnPA->Call($EntryNameSyntax, $EntryName, $IfSpec, $ObjectVector);
# EntryNameSyntax : DWORD -> DWORD
# EntryName : LPSTR optional -> LPCSTR
# IfSpec : void* optional -> LPVOID
# ObjectVector : UUID_VECTOR* optional -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

文字セット違い
公式の関連項目
使用する型