Генерация заглушек в Microsoft 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 определенно присутствует. Поэтому я не могу не переименовать клиент 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, теперь они удалены


person Yang    schedule 12.06.2012    source источник
comment
Трудно угадать, как вы получили такой код, в наши дни вы должны генерировать прокси-серверы без кода, опция /Oicf midl. Выложите командную строку midl.exe.   -  person Hans Passant    schedule 13.06.2012
comment
@HansPassant /W1 /nologo /char signed /env win32 /h "%(Filename).h" /tlb "Release\BROKERNET.tlb" На самом деле то, что я должен здесь сделать, касается вовсе не COM, а чисто RPC.   -  person Yang    schedule 14.06.2012


Ответы (1)


Не создавайте клиент и сервер в одном приложении.

Создайте фиктивное клиентское приложение на том же компьютере. Ты просто усложняешь себе жизнь.

person Toby Allen    schedule 13.06.2012
comment
Нет. Мне нужно сделать клиент и сервер в одном приложении, потому что я разрабатываю одноранговое приложение. - person Yang; 14.06.2012