A kiszolgálóalkalmazás
Az alábbi példa a Platform Software Development Kit (SDK) RPC\Hello könyvtárában található "Hello World" alkalmazásból származik. Az elosztott alkalmazás kiszolgálóoldala tájékoztatja a rendszert, hogy szolgáltatásai elérhetők. Ezután megvárja az ügyfélkéréseket. A MIDL-fordítót az alábbi példával kell használni.
Az alkalmazás méretétől és a kódolási beállításoktól függően dönthet úgy, hogy távoli eljárásokat implementál egy vagy több különálló fájlban. Ebben az oktatóanyag-programban a Hellos.c forrásfájl tartalmazza a fő kiszolgálói rutint. A Hellop.c fájl a távoli eljárást tartalmazza.
A távoli eljárások külön fájlokban való rendszerezésének előnye, hogy az eljárások összekapcsolhatók egy különálló programmal a kód hibakereséséhez, mielőtt az elosztott alkalmazássá alakul. Miután az eljárások az önálló programban működnek, lefordíthatja és összekapcsolhatja a távoli eljárásokat tartalmazó forrásfájlokat a kiszolgálóalkalmazással. Az ügyfél-alkalmazás forrásfájlhoz hasonlóan a kiszolgáló-alkalmazás forrásfájlnak is tartalmaznia kell a Hello.h fejlécfájlt.
A kiszolgáló meghívja az RPC futásidejű függvényeket RpcServerUseProtseqEp és RpcServerRegisterIf, hogy elérhetővé tegye a kötési információkat az ügyfél számára. Ez a példaprogram a kezelőfelület nevét átadja a(z) RpcServerRegisterIffüggvénynek. A többi paraméter a NULL van beállítva. A kiszolgáló ezután meghívja a RpcServerListen függvényt, hogy jelezze, hogy az ügyfélkérésekre vár.
A kiszolgálóalkalmazásnak tartalmaznia kell a kiszolgálói csonk által meghívott két memóriakezelési függvényt is: midl_user_allocate és midl_user_free. Ezek a függvények lefoglalják és felszabadítják a memóriát a kiszolgálón, amikor egy távoli eljárás paramétereket ad át a kiszolgálónak. Ebben a példaprogramban a midl_user_allocate és a midl_user_free egyszerű burkolók a C-könyvtár függvényeihez, malloc és free. (Vegye figyelembe, hogy a MIDL fordító által generált továbbítási deklarációkban a "MIDL" nagybetűs. Az Rpcndr.h fejlécfájl midl_user_free és midl_user_allocate határozza meg, hogy MIDL_user_free és MIDL_user_allocate legyen.)
/* 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);
}