Die Serveranwendung
Das folgende Beispiel stammt aus der Anwendung "Hallo Welt" im Verzeichnis RPC\Hello des Platform Software Development Kit (SDK). Die Serverseite der verteilten Anwendung informiert das System darüber, dass seine Dienste verfügbar sind. Anschließend wird auf Clientanforderungen gewartet. Der MIDL-Compiler muss mit dem folgenden Beispiel verwendet werden.
Abhängig von der Größe Ihrer Anwendung und Ihren Codierungseinstellungen können Sie Remoteprozeduren in einer oder mehreren separaten Dateien implementieren. In diesem Tutorialprogramm enthält die Quelldatei Hellos.c die Standard Serverroutine. Die Datei Hellop.c enthält die Remoteprozedur.
Der Vorteil der Organisation der Remoteprozeduren in separaten Dateien besteht darin, dass die Prozeduren mit einem eigenständigen Programm verknüpft werden können, um den Code zu debuggen, bevor er in eine verteilte Anwendung konvertiert wird. Nachdem die Prozeduren im eigenständigen Programm ausgeführt wurden, können Sie die Quelldateien, die die Remoteprozeduren enthalten, kompilieren und mit der Serveranwendung verknüpfen. Wie bei der Client-Anwendungsquelldatei muss die Server-Anwendungsquelldatei die Hello.h-Headerdatei enthalten.
Der Server ruft die RPC-Laufzeitfunktionen RpcServerUseProtseqEp und RpcServerRegisterIf auf, um Bindungsinformationen für den Client verfügbar zu machen. Dieses Beispielprogramm übergibt den Namen des Schnittstellenhandles an RpcServerRegisterIf. Die anderen Parameter sind auf NULL festgelegt. Der Server ruft dann die RpcServerListen-Funktion auf, um anzugeben, dass er auf Clientanforderungen wartet.
Die Serveranwendung muss auch die beiden Speicherverwaltungsfunktionen enthalten, die der Serverstub aufruft: midl_user_allocate und midl_user_free. Diese Funktionen weisen Arbeitsspeicher auf dem Server zu und geben diesen frei, wenn eine Remoteprozedur Parameter an den Server übergibt. In diesem Beispielprogramm sind midl_user_allocate und midl_user_free einfach Wrapper für die C-Bibliotheksfunktionen malloc und frei. (Beachten Sie, dass "MIDL" im MIDL-Compiler - generierte Forwarddeklarationen groß geschrieben wird. Die Headerdatei Rpcndr.h definiert midl_user_free und midl_user_allocate, die MIDL_user_free bzw. MIDL_user_allocate werden sollen.)
/* 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);
}