Dela via


Klientprogrammet

Exemplet nedan är från "Hello World"-programmet i katalogen RPC\Hello i Platform Software Development Kit (SDK). Helloc.c-källfilen innehåller ett direktiv som innehåller den MIDL-genererade huvudfilen Hello.h. I Hello.h finns direktiv för att inkludera Rpc.h och rpcndr.h, som innehåller definitionerna för RPC-körningsrutinerna, HelloProc och Avstängningoch datatyper som klient- och serverprogram använder. MIDL-kompilatorn måste användas med exemplet nedan.

Eftersom klienten hanterar sin anslutning till servern anropar klientprogrammet körningsfunktioner för att upprätta ett handtag till servern och för att frigöra handtaget när fjärrproceduranropen har slutförts. Funktionen RpcStringBindingCompose kombinerar komponenterna i bindningshandtaget till en strängrepresentation av handtaget och allokerar minne för strängbindningen. Funktionen RpcBindingFromStringBinding skapar en serverbindningsreferens hello_ClientIfHandleför klientprogrammet från strängrepresentationen.

I anropet till RpcStringBindingComposeanger parametrarna inte UUID eftersom den här självstudien förutsätter att det bara finns en implementering av gränssnittet "hello". Dessutom anger inte anropet någon nätverksadress eftersom programmet använder standardvärdet, som är den lokala värddatorn. Protokollsekvensen är en teckensträng som representerar den underliggande nätverkstransporten. Slutpunkten är ett namn som är specifikt för protokollsekvensen. I det här exemplet används namngivna rör för nätverkstransporten, så protokollsekvensen är "ncacn_np". Slutpunktens namn är "\pipe\hello".

De faktiska fjärrproceduranropen, HelloProc och Shutdown, sker inom RPC-undantagshanteraren – en uppsättning makron som låter dig styra undantag som inträffar utanför programkoden. Om RPC-körningsmodulen rapporterar ett undantag skickas kontrollen till RpcExcept--blocket. Det är här du infogar kod för att utföra nödvändig rensning och sedan avsluta korrekt. Det här exempelprogrammet informerar helt enkelt användaren om att ett undantag har inträffat. Om du inte vill använda undantag kan du använda ACF-attributen comm_status och fault_status för att rapportera fel.

När fjärrproceduranropen har slutförts anropar klienten först RpcStringFree- för att frigöra det minne som allokerades för strängbindningen. Observera att när bindningshandtaget har skapats kan ett klientprogram när som helst frigöra en strängbindning. Klienten anropar sedan RpcBindingFree- för att frigöra handtaget.

/* file: helloc.c */
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include "hello.h" 
#include <windows.h>

void main()
{
    RPC_STATUS status;
    unsigned char * pszUuid             = NULL;
    unsigned char * pszProtocolSequence = "ncacn_np";
    unsigned char * pszNetworkAddress   = NULL;
    unsigned char * pszEndpoint         = "\\pipe\\hello";
    unsigned char * pszOptions          = NULL;
    unsigned char * pszStringBinding    = NULL;
    unsigned char * pszString           = "hello, world";
    unsigned long ulCode;
 
    status = RpcStringBindingCompose(pszUuid,
                                     pszProtocolSequence,
                                     pszNetworkAddress,
                                     pszEndpoint,
                                     pszOptions,
                                     &pszStringBinding);
    if (status) exit(status);

    status = RpcBindingFromStringBinding(pszStringBinding, &hello_ClientIfHandle);
 
    if (status) exit(status);
 
    RpcTryExcept  
    {
        HelloProc(pszString);
        Shutdown();
    }
    RpcExcept(1) 
    {
        ulCode = RpcExceptionCode();
        printf("Runtime reported exception 0x%lx = %ld\n", ulCode, ulCode);
    }
    RpcEndExcept
 
    status = RpcStringFree(&pszStringBinding); 
 
    if (status) exit(status);
 
    status = RpcBindingFree(&hello_IfHandle);
 
    if (status) exit(status);

    exit(0);
}

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