Aplikacja serwera
Poniższy przykład pochodzi z aplikacji "Hello World" w katalogu RPC\Hello zestawu Sdk platformy. Strona serwera aplikacji rozproszonej informuje system, że jego usługi są dostępne. Następnie czeka na żądania klientów. Kompilator MIDL musi być używany z poniższym przykładem.
W zależności od rozmiaru aplikacji i preferencji kodowania można wdrożyć procedury zdalne w co najmniej jednym oddzielnym pliku. W tym programie instruktażowym plik źródłowy Hellos.c zawiera główną procedurę serwera. Plik Hellop.c zawiera procedurę zdalną.
Zaletą organizowania procedur zdalnych w osobnych plikach jest to, że procedury można połączyć z autonomicznym programem w celu debugowania kodu przed przekonwertowaniem go na aplikację rozproszoną. Po wykonaniu procedur w programie autonomicznym można skompilować i połączyć pliki źródłowe zawierające procedury zdalne z aplikacją serwera. Podobnie jak w przypadku pliku źródłowego aplikacji klienckiej, plik źródłowy aplikacji serwera musi zawierać plik nagłówka Hello.h.
Serwer wywołuje funkcje czasu wykonywania RPC RpcServerUseProtseqEp i RpcServerRegisterIf w celu udostępnienia informacji o powiązaniu klientowi. Ten przykładowy program przekazuje nazwę dojścia interfejsu do RpcServerRegisterIf. Inne parametry są ustawione na wartość null. Następnie serwer wywołuje funkcję RpcServerListen, aby wskazać, że oczekuje na żądania klientów.
Aplikacja serwera musi również zawierać dwie funkcje zarządzania pamięcią wywoływane przez szkielet serwera: midl_user_allocate i midl_user_free. Te funkcje przydzielają i zwalniają pamięć na serwerze, gdy procedura zdalna przekazuje parametry do serwera. W tym przykładowym programie midl_user_allocate i midl_user_free są po prostu otoczkami funkcji biblioteki C malloc i free. (Należy pamiętać, że w deklaracjach przesyłania dalej wygenerowanych przez kompilator MIDL, "MIDL" jest pisane wielkimi literami. Plik nagłówkowy Rpcndr.h definiuje midl_user_free i midl_user_allocate jako MIDL_user_free i MIDL_user_allocate, odpowiednio).
/* 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);
}