Предоставление интерфейса в 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, чтобы он был
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, теперь они удалены
/W1 /nologo /char signed /env win32 /h "%(Filename).h" /tlb "Release\BROKERNET.tlb"
На самом деле то, что я должен здесь сделать, касается вовсе не COM, а чисто RPC. - person Yang   schedule 14.06.2012