Microsoft IDL でのインターフェイスの提供
[
uuid(04802821-F237-486D-BC90-B6BB048DC8B2),
version(1.0)
]
interface RPC
{
void foo([in, string] char * string)
}
生成されるスタブおよびヘッダー ファイルは、rpc_c.c、rpc_s.c、および rpc_h.h です。ヘッダー ファイル rpc_h.h で、関数 foo を宣言します。
void foo( char * string );
rpc_c.c では、クライアントのバージョンが自動的に定義されます
void foo( char * string)
{
NdrClientCall(...);
}
しかし今、テスト目的で同じプログラムにクライアントとサーバーを実装したいと考えています。
#include "rpc_h.h"
#include "rpc_c.c"
#include "rpc_s.c"
/*server foo*/
void foo(char * string)
{
printf("%s\n", string);
}
/*server*/
void server()
{
//RpcServerRegisterIfEx(...);
//RpcServerUseProtseqEp(...);
//RpcServerListen(...);
}
int main(int args, char * argv[])
{
/*server runs*/
CreateThread(NULL, 0, server, argv[1], 0, NULL);
/*make RPC as client*/
foo(argv[2]);
}
ご覧のとおり、確かにクライアント foo とサーバー foo の両方の再定義に関するエラーがあります。したがって、rpc_c.c のクライアント foo の名前を手動で変更するしかありません。
void foo_client( char * string)
{
NdrClientCall(...);
}
rpc_h.h でサーバーのバージョンと一緒に宣言します
void foo_client( char * string );
void foo( char * string );
したがって、RPCをメインのクライアントとして作成するときは、
foo_client(argv[2]);
それはうまくいきますが、少しハッキーに見えます。代わりにこれに対する適切な解決策はありますか?
PS: ご心配かもしれませんが、私は純粋なシステム RPC で開発しています。COM、COM+、DCOM、さらにはオブジェクト指向についての話ではありません。DHT に基づいてピアツーピア アプリケーションを開発しているため、同じアプリケーションにクライアントとサーバーを実装する必要があります。com および dcom タグについては申し訳ありませんが、現在は削除されています