クライアント +----+ | | ユーザーインターフェース +----+ +--------+ +--------+ ↑ | | +-------------+-------------+ | | | | | | ↓ ↓ ↓ +--------+ +--------+ +--------+ | データ | | 計算 | | 計算 | | ベース | | 処理 | | 処理 | |サーバー| |サーバー| |サーバー| | | | 1 | | 2 | +--------+ +--------+ +--------+
C:\>uuidgen 071ced00-4889-11d0-90fd-0040c757956e
C:\>uuidgen -i [ uuid(071ced00-4889-11d0-90fd-0040c757956e), version(1.0) ] interface INTERFACENAME { }
クライアント サーバー +--------------+ +-------------+ | 関数呼び出し | |呼び出される | | | | 関数本体 | | ↓ ↑ | | ↓ ↑ | +--------------+ +-------------+ | スタブ | ← IDLファイルから→ | スタブ | | ↓ ↑ | 生成されたスタブ | ↓ ↑ | +--------------+ +-------------+ |RPCランタイム | |RPCランタイム| | ↓ ↑ | | ↓ ↑ | +--------------+ +-------------+ |通信プロトコル| |通信プロトコル| +--------------+ +-------------+ | ↑ ネットワーク | ↑ | +----------------------------+ | +-------------------------------------------+
クライアント サーバー +------------+ +------------+ | | | | +→| | | |----+ | | | | | | | +------------+ +-----□-----+ | | | ↑ 端点 | | | | | | |(3)リモートプロシージャの呼び出し | | | +-----------------------------------+ (1)バインド情報の | エクスポート | | | ↓ | +------------+ +-------- (2)バインド情報のインポート ----------| ネーム | | サービス | | | +------------+
[ implicit_handle(handle_t hRemoteHandle) ] interface Remote { } (a)暗黙バインディング |
[ auto_handle ] interface Remote { } (b)自動バインディング |
| ref | 参照ポインタ(参照データのポインタ) |
| unique | ユニークポインタ(NULLポインタを識別できる参照ポインタ) |
| ptr | フルポインタ(複雑なデータ構造を扱える) |
| string | '\0'で終わる文字列を指すポインタ |
| boolean | TRUEまたはFALSEを指定する |
| byte | 8ビット |
| char | 符号なし8ビット |
| double | 64ビット浮動小数点 |
| float | 32ビット浮動小数点 |
| handle_t | プリミティブハンドル |
| hyper | 64ビット整数 |
| long | 32ビット整数 |
| short | 16ビット整数 |
| small | 8ビット整数 |
| wchar_t | ワイドキャラクタ(/ms_extを指定時) |
UUIDGENで +------------------------+ UUIDを生成する ----→| RPCAPP.IDL | +------------------------+ +------------------------+ | RPCAPP.ACL | +------------------------+ | MIDLコンパイラ(MIDL.EXE) ↓ でコンパイルする +------------------------+ +------ | RPCAPP.H * | ------+ | +------------------------+ | | +------------------------+ | | | RPCAPP_S.C * | | | +------------------------+ | | +------------------------+ | | | RPCAPP_C.C * | | | +------------------------+ | ↓インクルード | ↓インクルード +------------------------+ | +-----------------------+ | SERVER.C | | | CLIENT.C | +------------------------+ | +-----------------------+ ↓コンパイル | ↓コンパイル +------------------------+ | +-----------------------+ | SERVER.OBJ | | | CLIENT.OBJ | +------------------------+ | +-----------------------+ | ↓コンパイル | | +------------------------+ | | +---| RPCAPP_S.OBJ | | | | +------------------------+ | | | +------------------------+ | | | | RPCAPP_C.OBJ |---+ | | | +------------------------+ | | | | | | ↓ ↓リンク ↓ ↓リンク +------------------------+ +-----------------------+ | SERVER.EXE | | CLIENT.EXE | +------------------------+ +-----------------------+ サーバー クライアント * MIDLコンパイラによって生成されるファイル
long ServerProc([in,string] unsigned char *lpszClientName,[in] boolean fCallBack); (a)通常のプロシージャ [callback] void ClientProc([in,string] unsigned char *lpszServerName); (b)コールバックプロシージャ
| オブジェクト | 関数名の識別子 | 例 |
|---|---|---|
| バインディングハンドル | RpcBinding | RpcBindingFree |
| 端点 | RpcEp | RpcEpRegister |
| インタフェース | RpcIf | RpcIfInqId |
| マネージメント | RpcMgmt | RpcMgmtStopServerListening |
| ネームサービス(グループエントリー) | RpcNsGroup | RpcNsGroupDelete |
| ネームサービス(マネージメント) | RpcNsMgmt | RpcNsMgmtEntryCreate |
| ネームサービス(プロファイルエントリー) | RpcNsProfile | RpcNsProfileEltAdd |
| ネームサービス(サービスエントリー) | RpcNsBinding | RpcNsBindingExport |
| ネットワーク | RpcNetwork | RpcNetworkInqProtseqs |
| オブジェクト | RpcObject | RpcObjectSetType |
| プロトコルシーケンスベクター | RpcProtseqVector | RpcProtseqVectorFree |
| サーバー | RpcServer | RpcServerListen |
| 文字列 | RpcString | RpcStringFree |
| 文字列バインディング | RpcStringBinding | RpcStringBindingCompose |
| UUIDの操作 | Uuid | UuidCreate |
RpcTryExcept{ ServerProc(szMachineName, fCallBack); /* リモートプロシジャの実行 */ } RpcExcept(1){ /* 異常終了した */ rsResult = RpcExceptionCode(); } RpcEndExcept;
+------------------------------------------+ | アプリケーション | +------------------------------------------+ ↑ ↑ | | RPC_API | | | | | +------------------------+ | RPC_USER | スタブ | RPC_ENTRY | +------------------------+ | | ↑ | | | RPC_STUB RPC_ENTRY | | | ↓ ↓ +------------------------------------------+ | RPCランタイムライブラリ | +------------------------------------------+
| マクロ | 説明 |
|---|---|
| __RPC_API | スタブから呼び出されるユーザアプリケーション関数 |
| __RPC_FAR | ポインタの標準マクロ |
| __RPC_STUB | RPCランタイムライブラリから呼び出されるスタブ関数 |
| __RPC_USER | RPCランタイムライブラリからユーザアプリケーション関数 |
| __RPC_ENTRY | ユーザアプリケーションまたはスタブから呼び出されるRPCランタイム関数 |
void __RPC_FAR * __RPC_USER MIDL_user_allocate(size_t len) { return HeapAlloc(GetProcessHeap(), 0, len); } void __RPC_USER MIDL_user_free(void __RPC_FAR * ptr) { HeapFree(GetProcessHeap(), 0, ptr); }
| プロトコル | クライアント | サーバ |
|---|---|---|
| ncacn_nb_tcp コネクション指向 NetBIOS オーバーTCP |
MS-DOS, Windows 3.x, WindowsNT |
WindowsNT |
| ncacn_nb_ipx コネクション指向 NetBIOS オーバーIPX |
MS-DOS, Windows 3.x, Windows95, WindowsNT |
Windows95, WindowsNT |
| ncacn_nb_nb コネクション指向 NetBEUI |
MS-DOS, Windows 3.x, Windows95, WindowsNT |
Windows95, WindowsNT |
| ncacn_ip_tcp コネクション指向 TCP/IP |
MS-DOS, Windows 3.x, Windows95, WindowsNT Macintosh |
Windows95, WindowsNT |
| ncacn_np コネクション指向名前付きパイプ |
MS-DOS, Windows 3.x, Windows95, WindowsNT |
Windows NT |
| ncacn_spx コネクション指向 SPX |
MS-DOS, Windows 3.x, Windows95, WindowsNT |
Windows95, WindowsNT |
| ncacn_dnet_nsp コネクション指向 DECnet トランスポート |
MS-DOS, Windows 3.x | |
| ncacn_at_dsp AppleTalk DSP |
Macintosh server | WindowsNT |
| ncacn_vns_spp コネクション指向 Vines SPP トランスポート |
WindowsNT | WindowsNT |
| ncadg_ip_udp データグラム(コネクションレス) UDP/IP |
MS-DOS, Windows 3.x, WindowsNT |
WindowsNT |
| ncadg_ipx データグラム(コネクションレス) IPX |
MS-DOS, Windows 3.x, WindowsNT |
WindowsNT |
| ncalrpc ローカルプロシージャコール |
Windows95, WindowsNT | Windows95, WindowsNT |
| ncacn_nb_tcp | マシン名 |
| ncacn_nb_ipx | マシン名 |
| ncacn_nb_nb | マシン名 |
| ncacn_ip_tcp | インターネットアドレス (xxx.xxx.xxx.xxx) |
| ncacn_np | サーバ名 |
| ncacn_sp | IPX インターネットアドレスまたはサーバ名 |
| ncacn_dnet_nsp | エリア, ノードシンタックス |
| ncacn_at_dsp | マシン名, マシン名@ゾーン名 (servername@zonename) |
| ncacn_vns_spp | StreetTalkサーバ名 (item@group@organization) |
| ncadg_ip_udp | インターネットアドレス |
| ncadg_ipx | IPX インターネットアドレスまたはサーバ名 |
| ncalrpc | マシン名 |
| ncacn_nb_tcp | 0から255(0から32はMicrosoftが予約) |
| ncacn_nb_ipx | 0から255(0から32はMicrosoftが予約) |
| ncacn_nb_nb | 0から255(0から32はMicrosoftが予約) |
| ncacn_ip_tcp | インターネットポート番号 |
| ncacn_np | 名前付きパイプ名(\\pipe\\paiename) |
| ncacn_sp | 1から65535 |
| ncacn_dnet_nsp | DECnetフェーズIV オブジェクト番号 #nn |
| ncacn_at_dsp | 22バイト以内の文字列 |
| ncacn_vns_spp | Vines SPP ポート番号 255から511 |
| ncadg_ip_udp | インターネットポート番号 |
| ncadg_ipx | 1から65535 |
| ncalrpc | アプリケーションまたはサーバー固有文字列 |
HKEY_LOCAL_MACHINE + \SOFTWARE + \Microsoft + \RPC + \ClientProtocols ←クライアントで利用できるプロトコル + \ServerProtocols ←サーバで利用できるプロトコル
HKEY_LOCAL_MACHINE + \SOFTWARE + \Microsoft + \RPC + \NameService
HKEY_LOCAL_MACHINE + \SOFTWARE + \Microsoft + \RPC + \NameService DefaultSyntax REG_SZ = 3 EndPoint REG_SZ = \\pipe\\locator NetworkAddress REG_SZ = \\NTSERVER Protocol REG_SZ = ncacn_np ServerNetworkAddress REG_SZ = \\NTSERVER