次の例は、プラットフォーム ソフトウェア開発キット (SDK) の RPC\Hello ディレクトリにある "Hello World" アプリケーションの例です。 分散アプリケーションのサーバー側は、そのサービスが使用可能であることをシステムに通知します。 次にクライアントからの要求を待ちます。 MIDL コンパイラは、次の例と共に使用する必要があります。
アプリケーションのサイズとコーディング設定に応じて、1 つ以上の個別のファイルにリモート プロシージャを実装することを選択できます。 このチュートリアル プログラムでは、ソース ファイル Hellos.c にメイン サーバー ルーチンが含まれています。 Hellop.c ファイルには、リモート プロシージャが含まれています。
リモート プロシージャを別々のファイルに整理する利点は、プロシージャをスタンドアロン プログラムにリンクして、分散アプリケーションに変換する前にコードをデバッグできることです。 スタンドアロン・プログラムでプロシージャーが機能したら、リモート・プロシージャーを含むソース・ファイルをコンパイルして、サーバー・アプリケーションとリンクすることができます。 クライアント アプリケーション ソース ファイルと同様に、サーバー アプリケーション ソース ファイルには Hello.h ヘッダー ファイルを含める必要があります。
サーバーは RpcServerUseProtseqEp および RpcServerRegisterIf の RPC ランタイム関数を呼び出して、バインディング情報をクライアントで使用できるようにします。 このプログラム例では、インターフェイス ハンドル名を RpcServerRegisterIf 渡します。 その他のパラメーターは、NULL に設定されます。 その後、サーバーは RpcServerListen 関数を呼び出して、クライアント要求を待機していることを示します。
サーバー アプリケーションには、サーバー スタブが呼び出す 2 つのメモリ管理機能 (midl_user_allocate と midl_user_free) も含める必要があります。 これらの関数は、リモート プロシージャがサーバーにパラメーターを渡すときに、サーバーにメモリを割り当てて解放します。 このプログラム例では、midl_user_allocate と midl_user_free は、Cライブラリ関数の malloc と freeのラッパーにすぎません。 (MIDL コンパイラで生成された前方宣言では、「MIDL」は大文字であることに注意してください。ヘッダーファイル Rpcndr.h では midl_user_free と midl_user_allocate は、それぞれ MIDL_user_free と MIDL_user_allocate に定義されています。)
/* 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);
}