1

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 タグについては申し訳ありませんが、現在は削除されています

4

1 に答える 1

0

同じアプリケーションでクライアントとサーバーを作成しないでください。

同じマシン上にダミーのクライアント アプリケーションを作成します。あなたはあなたの人生を難しくしているだけです。

于 2012-06-13T13:38:18.817 に答える