Megosztás a következőn keresztül:


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);
}