在 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 标签感到抱歉,它们现在已被删除