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 的重新定义肯定存在错误。所以我不得不手动将 rpc_c.c 中的客户端 foo 重命名为

void foo_client( char * string)
{
    NdrClientCall(...);
}

并在 rpc_h.h 中与服务器版本一起声明

void foo_client( char * string );
void foo( char * string );

因此,当我在 main 中将 RPC 作为客户端时,我会

foo_client(argv[2]);

它可以解决,但看起来有点hacky。有没有一个体面的解决方案呢?

PS:对于可能关心的人,我使用纯系统RPC进行开发。它根本与 COM、COM+、DCOM 甚至面向对象无关。我正在开发一个基于 DHT 的点对点应用程序,所以我必须在同一个应用程序中实现客户端和服务器。对 com 和 dcom 标签感到抱歉,它们现在已被删除

4

1 回答 1

0

不要在同一个应用程序中创建客户端和服务器。

在同一台机器上创建一个虚拟客户端应用程序。你只是让你的生活变得困难。

于 2012-06-13T13:38:18.817 回答