古いソースを整理していたら RPC を扱ったコードを見つけたので、自分の覚え書きにサンプルを残しておきます。
IDL ファイルの uuid は guidgen.exe (VS2015 メニューの [ツール] - [GUID の作成] で起動できる) で作成しました。
[ uuid(AD80D55D-F231-4B20-86CF-E71AC3912D2E), // このインターフェース定義に割り当てる UUID = AD80D55D-F231-4B20-86CF-E71AC3912D2E ...
クライアント、サーバー共に、IDL ファイルのプロパティで、[MIDL] - [コマンドライン] で ACF ファイル (RpcTest.acf) を指定しました。
RPC のバインドハンドルをローカルで変数定義して指定したかったため、explicit_handle を指定しました。
[ explicit_handle ] interface testrpc { }
クライアント、サーバー共に、プロジェクトのプロパティで、[全般] - [文字セット] に [Unicode 文字セットを使用する] を設定しました。
※VS2015 でプロジェクトを新規作成した時のデフォルト値でした。
クライアント、サーバー共に、IDL ファイルのプロパティで、[MIDL] - [全般] - [プリプロセッサの定義] に _UNICODE および UNICODE を追加しました。
一旦、IDL ファイルのみをコンパイルし、生成された RpcTest_c.c はクライアントプロジェクトに、 RpcTest_s.c はサーバープロジェクトに追加しました。
プロジェクトのプロパティで、クライアントは RpcTest_c.c に、サーバーは RpcTest_s.c に、 それぞれ、 [C/C++] - [プリコンパイル済みヘッダー] - [プリコンパイル済みヘッダー] に [プリコンパイル済みヘッダーを使用しない] を設定しました。
クライアント、サーバー共に、プロジェクトのプロパティで、[リンカー] - [入力] - [追加の依存ファイル] に rpcrt4.lib を設定しました。
RpcUser.h として保存し、クライアント、サーバー、それぞれのソースからインクルードして利用するようにしました。
#ifdef __DEFINE_RPC_USER_ROUTINE__ //---------------------------------------------------------------------- // メモリ確保 //---------------------------------------------------------------------- void __RPC_FAR * __RPC_API midl_user_allocate(size_t length) { return new unsigned char[length]; } //---------------------------------------------------------------------- // メモリ解放 //---------------------------------------------------------------------- void __RPC_API midl_user_free(void __RPC_FAR* ptr) { delete[] ptr; } #else // __DEFINE_RPC_USER_ROUTINE__ extern void __RPC_FAR * __RPC_API midl_user_allocate(size_t length); extern void __RPC_API midl_user_free(void __RPC_FAR* ptr); #endif // __DEFINE_RPC_USER_ROUTINE__
クライアントでの RPC 呼び出しをクラス風にしてみました。ソースをご参照下さい。