在Microsoft IDL中生成存根

时间:2012-06-12 22:40:40

标签: client-server rpc idl

在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 );

因此,当我在主服务器中将RPC作为客户端时,我会这样做

foo_client(argv[2]);

它起作用但看起来有点hacky。有没有一个像样的解决方案呢?

PS:对于那些可能关心的人,我使用纯系统RPC开发。它不是关于COM,COM +,DCOM甚至是面向对象的。我正在开发基于DHT的点对点应用程序,所以我必须在同一个应用程序中实现客户端和服务器。抱歉com和dcom代码已被删除

1 个答案:

答案 0 :(得分:0)

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

在同一台计算机上创建虚拟客户端应用程序。你的生活很艰难。