Aplikasi Klien

Contoh di bawah ini berasal dari aplikasi 'Halo Dunia' di direktori RPC\Hello dari Platform Software Development Kit (SDK). File sumber Helloc.c berisi direktif untuk menyertakan file header yang dihasilkan MIDL, Hello.h. Dalam Hello.h adalah arahan untuk menyertakan Rpc.h dan rpcndr.h, yang berisi definisi untuk rutinitas run-time RPC, HelloProc dan Shutdown, dan jenis data yang digunakan aplikasi klien dan server. Pengkompilasi MIDL harus digunakan dengan contoh di bawah ini.

Karena klien mengelola koneksinya ke server, aplikasi klien memanggil fungsi run-time untuk membuat handel ke server dan untuk merilis handel ini setelah panggilan prosedur jarak jauh selesai. Fungsi RpcStringBindingCompose menggabungkan komponen handel pengikatan ke dalam representasi string dari handel tersebut dan mengalokasikan memori untuk pengikatan string. Fungsi RpcBindingFromStringBinding membuat handel pengikatan server, hello_ClientIfHandle, untuk aplikasi klien dari representasi string tersebut.

Dalam panggilan ke RpcStringBindingCompose, parameter tidak menentukan UUID karena tutorial ini mengasumsikan hanya ada satu implementasi antarmuka "hello." Selain itu, panggilan tidak menentukan alamat jaringan karena aplikasi akan menggunakan default, yang merupakan komputer host lokal. Urutan protokol adalah string karakter yang mewakili transportasi jaringan yang mendasar. Titik akhir adalah nama yang khusus untuk urutan protokol. Contoh ini menggunakan pipa bernama untuk transportasi jaringannya, sehingga urutan protokolnya adalah "ncacn_np". Nama titik akhir adalah "\pipe\hello".

Panggilan prosedur jarak jauh aktual, HelloProc dan Shutdown, berlangsung dalam handler pengecualian RPC—sekumpulan makro yang memungkinkan Anda mengontrol pengecualian yang terjadi di luar kode aplikasi. Jika modul run-time RPC melaporkan pengecualian, kontrol akan diteruskan ke blok RpcExcept . Di sinilah Anda akan memasukkan kode untuk melakukan pembersihan yang diperlukan dan kemudian keluar dengan anggun. Contoh program ini hanya memberi tahu pengguna bahwa terjadi pengecualian. Jika Anda tidak ingin menggunakan pengecualian, Anda dapat menggunakan atribut ACF comm_status dan fault_status untuk melaporkan kesalahan.

Setelah panggilan prosedur jarak jauh selesai, klien pertama-tama memanggil RpcStringFree untuk membebaskan memori yang dialokasikan untuk pengikatan string. Perhatikan bahwa setelah handel pengikatan dibuat, program klien dapat membebaskan pengikatan string kapan saja. Klien selanjutnya memanggil RpcBindingFree untuk merilis handel.

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