Aracılığıyla paylaş


İstemci Uygulaması

Aşağıdaki örnek, Platform Yazılım Geliştirme Seti'nin (SDK) RPC\Hello dizinindeki 'Hello World' uygulamasındandır. Helloc.c kaynak dosyası, MIDL tarafından oluşturulan Hello.h üst bilgi dosyasını içeren bir yönerge içerir. Hello.h içinde RPC çalışma zamanı yordamlarının tanımlarını içeren Rpc.h ve rpcndr.h, HelloProc ve Shutdownve istemci ve sunucu uygulamalarının kullandığı veri türlerini içeren yönergeler bulunur. MIDL derleyicisi aşağıdaki örnekle kullanılmalıdır.

İstemci sunucu bağlantısını yönettiğinden, istemci uygulaması sunucuya bir tanıtıcı oluşturmak ve uzak yordam çağrıları tamamlandıktan sonra bu tanıtıcıyı serbest bırakmak için çalışma zamanı işlevlerini çağırır. RpcStringBindingComposeişlevi bağlama tutamacının bileşenlerini bu tanıtıcının dize gösteriminde birleştirir ve dize bağlaması için bellek ayırır. rpcbindingFromStringBindingişlevi, bu dize gösteriminden istemci uygulaması için hello_ClientIfHandlebir sunucu bağlama tutamacı oluşturur.

RpcStringBindingComposeçağrısında parametreler UUID'yi belirtmez çünkü bu öğreticide "hello" arabiriminin yalnızca bir uygulaması olduğu varsayılır. Buna ek olarak, uygulama yerel konak makinesi olan varsayılanı kullanacağından, çağrı bir ağ adresi belirtmez. Protokol dizisi, temel alınan ağ aktarımını temsil eden bir karakter dizesidir. Uç nokta, protokol dizisine özgü bir addır. Bu örnekte ağ aktarımı için adlandırılmış kanallar kullanılır, bu nedenle protokol dizisi "ncacn_np" olur. Uç nokta adı "\pipe\hello" şeklindedir.

HelloProc ve Shutdown gerçek uzak yordam çağrıları, uygulama kodu dışında oluşan özel durumları denetlemenize olanak sağlayan bir makro kümesi olan RPC özel durum işleyicisi içinde gerçekleşir. RPC çalışma zamanı modülü özel durum bildirirse, denetim RpcExcept bloğuna geçer. Burada gerekli temizlemeleri yapmak için kod ekleyip düzgün bir şekilde çıkabilirsiniz. Bu örnek program yalnızca kullanıcıya bir özel durumun oluştuğu hakkında bilgi sağlar. Özel durumları kullanmak istemiyorsanız, hataları bildirmek için ACF özniteliklerini comm_status ve fault_status kullanabilirsiniz.

Uzak yordam çağrıları tamamlandıktan sonra, istemci ilk olarak dize bağlaması için ayrılan belleği boşaltmak için RpcStringFreeçağırır. Bağlama tutamacı oluşturulduktan sonra istemci programının herhangi bir zamanda bir dize bağlamasını serbest tutabileceğini unutmayın. İstemci, tanıtıcıyı serbest bırakmak için RpcBindingFree çağırır.

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