Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
L'esempio seguente proviene dall'applicazione 'Hello World' nella directory RPC\Hello di Platform Software Development Kit (SDK). Il lato server dell'applicazione distribuita informa il sistema che i relativi servizi sono disponibili. Attende quindi le richieste client. Il compilatore MIDL deve essere usato con l'esempio seguente.
A seconda delle dimensioni dell'applicazione e delle preferenze di codifica, è possibile scegliere di implementare procedure remote in uno o più file separati. In questo programma di esercitazione il file di origine Hellos.c contiene la routine del server principale. Il file Hellop.c contiene la procedura remota.
Il vantaggio di organizzare le procedure remote in file separati è che le procedure possono essere collegate a un programma autonomo per eseguire il debug del codice prima che venga convertito in un'applicazione distribuita. Dopo che le procedure funzionano nel programma autonomo, è possibile compilare e collegare i file di origine contenenti le procedure remote con l'applicazione server. Come per il file di origine dell'applicazione client, il file di origine dell'applicazione server deve includere il file di intestazione Hello.h.
Il server chiama le funzioni di runtime RPC RpcServerUseProtseqEp e RpcServerRegisterIf per rendere disponibili le informazioni di associazione al client. Questo programma di esempio passa il nome dell'handle di interfaccia a RpcServerRegisterIf. Gli altri parametri sono impostati su NULL. Il server chiama quindi la funzionerpcServerListenper indicare che è in attesa di richieste client.
L'applicazione server deve includere anche le due funzioni di gestione della memoria chiamate dallo stub del server: midl_user_allocate e midl_user_free. Queste funzioni allocano e liberano memoria nel server quando una routine remota passa parametri al server. In questo programma di esempio, midl_user_allocate e midl_user_free sono semplicemente wrapper per le funzioni della libreria C malloc e free. Si noti che, nelle dichiarazioni anticipate generate dal compilatore MIDL, "MIDL" è in lettere maiuscole. Il file di intestazione Rpcndr.h definisce rispettivamente midl_user_free e midl_user_allocate come MIDL_user_free e 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);
}