Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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>
#pragma comment(lib, "Rpcrt4.lib")
int main()
{
RPC_STATUS status;
unsigned short* pszProtocolSequence = (unsigned short*)L"ncacn_np";
unsigned short* pszSecurity = NULL;
unsigned short* pszEndpoint = (unsigned short*)L"\\pipe\\hello";
unsigned int cMinCalls = 1;
unsigned int fDontWait = FALSE;
status = RpcServerUseProtseqEpW(pszProtocolSequence,
RPC_C_LISTEN_MAX_CALLS_DEFAULT,
pszEndpoint,
pszSecurity);
if (status) exit(status);
status = RpcServerRegisterIf(hello_v1_0_s_ifspec,
NULL,
NULL);
if (status) exit(status);
status = RpcServerListen(cMinCalls,
RPC_C_LISTEN_MAX_CALLS_DEFAULT,
fDontWait);
if (status) exit(status);
}
void HelloProc(unsigned char * pszString)
{
printf("%s\n", pszString);
}
/******************************************************/
/* 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);
}