【问题标题】:Generation of stubs in Microsoft IDL在 Microsoft IDL 中生成存根
【发布时间】:2012-06-15 21:08:23
【问题描述】:

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

【问题讨论】:

  • 很难猜出你是如何得到这样的代码的,你现在应该生成无代码代理,/Oicf midl 选项。发布 midl.exe 命令行。
  • @HansPassant /W1 /nologo /char signed /env win32 /h "%(Filename).h" /tlb "Release\BROKERNET.tlb" 实际上我在这里要做的根本不是关于 COM 而是纯粹的 RPC。

标签: client-server rpc idl


【解决方案1】:

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

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

【讨论】:

  • 没有。我必须在同一个应用程序中创建客户端和服务器,因为它是我正在开发的点对点应用程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
  • 2016-09-21
  • 1970-01-01
  • 2011-06-17
  • 2011-03-26
  • 1970-01-01
相关资源
最近更新 更多