Серверное приложение
Приведенный ниже пример получен из приложения "Hello World" в каталоге RPC\Hello пакета средств разработки программного обеспечения платформы (SDK). Серверная часть распределенного приложения информирует систему о доступности его служб. Затем он ожидает клиентских запросов. Компилятор MIDL необходимо использовать в приведенном ниже примере.
В зависимости от размера приложения и настроек кодирования можно реализовать удаленные процедуры в одном или нескольких отдельных файлах. В этом руководстве исходный файл Hellos.c содержит подпрограмму сервера main. Файл Hellop.c содержит удаленную процедуру.
Преимущество организации удаленных процедур в отдельных файлах заключается в том, что процедуры можно связать с автономной программой для отладки кода перед его преобразованием в распределенное приложение. После выполнения процедур в автономной программе можно скомпилировать и связать исходные файлы, содержащие удаленные процедуры, с серверным приложением. Как и в случае с исходным файлом "клиент-приложение", исходный файл сервер-приложение должен содержать файл заголовка Hello.h.
Сервер вызывает функции времени выполнения RPC RpcServerUseProtseqEp и RpcServerRegisterIf , чтобы сделать сведения о привязке доступными для клиента. В этом примере программа передает имя дескриптора интерфейса в RpcServerRegisterIf. Остальные параметры имеют значение NULL. Затем сервер вызывает функцию RpcServerListen , чтобы указать, что он ожидает клиентских запросов.
Серверное приложение также должно включать две функции управления памятью, которые вызывает заглушка сервера: midl_user_allocate и midl_user_free. Эти функции выделяют и освобождают память на сервере, когда удаленная процедура передает параметры серверу. В этом примере программы midl_user_allocate и midl_user_free являются просто оболочками для функций библиотеки C malloc и free. (Обратите внимание, что в объявлениях вперед, создаваемых компилятором MIDL, "MIDL" имеет прописные буквы. Файл заголовка Rpcndr.h определяет, midl_user_free и midl_user_allocate должны быть MIDL_user_free и MIDL_user_allocate соответственно.)
/* file: hellos.c */
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include "hello.h"
#include <windows.h>
void main()
{
RPC_STATUS status;
unsigned char * pszProtocolSequence = "ncacn_np";
unsigned char * pszSecurity = NULL;
unsigned char * pszEndpoint = "\\pipe\\hello";
unsigned int cMinCalls = 1;
unsigned int fDontWait = FALSE;
status = RpcServerUseProtseqEp(pszProtocolSequence,
RPC_C_LISTEN_MAX_CALLS_DEFAULT,
pszEndpoint,
pszSecurity);
if (status) exit(status);
status = RpcServerRegisterIf(hello_ServerIfHandle,
NULL,
NULL);
if (status) exit(status);
status = RpcServerListen(cMinCalls,
RPC_C_LISTEN_MAX_CALLS_DEFAULT,
fDontWait);
if (status) exit(status);
}
/******************************************************/
/* MIDL allocate and free */
/******************************************************/
void __RPC_FAR * __RPC_USER midl_user_allocate(size_t len)
{
return(malloc(len));
}
void __RPC_USER midl_user_free(void __RPC_FAR * ptr)
{
free(ptr);
}