サーバー アプリケーション
次の例は、プラットフォーム ソフトウェア開発キット (SDK) の RPC\Hello ディレクトリにある "Hello World" アプリケーションの例です。 分散アプリケーションのサーバー側は、そのサービスが使用可能であることをシステムに通知します。 その後、クライアント要求を待機します。 MIDL コンパイラは、次の例と共に使用する必要があります。
アプリケーションのサイズとコーディング設定に応じて、1 つ以上の個別のファイルにリモート プロシージャを実装することを選択できます。 このチュートリアル プログラムでは、ソース ファイル Hellos.c にメイン サーバー ルーチンが含まれています。 Hellop.c ファイルにはリモート プロシージャが含まれています。
リモート プロシージャを別々のファイルに整理する利点は、プロシージャをスタンドアロン プログラムとリンクして、分散アプリケーションに変換する前にコードをデバッグできることです。 スタンドアロン・プログラムでプロシージャーが機能したら、リモート・プロシージャーを含むソース・ファイルをコンパイルして、サーバー・アプリケーションとリンクすることができます。 クライアント アプリケーション ソース ファイルと同様に、サーバー アプリケーション ソース ファイルには Hello.h ヘッダー ファイルを含める必要があります。
サーバーは RPC ランタイム関数 RpcServerUseProtseqEp と RpcServerRegisterIf を呼び出して、バインド情報をクライアントで使用できるようにします。 このプログラム例では、インターフェイス ハンドル名を 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>
void main()
{
RPC_STATUS status;
unsigned char * pszProtocolSequence = "ncacn_np";
unsigned char * pszSecurity = NULL;
unsigned char * pszEndpoint = "\\pipe\\hello";
unsigned int cMinCalls = 1;
unsigned int fDontWait = FALSE;
status = RpcServerUseProtseqEp(pszProtocolSequence,
RPC_C_LISTEN_MAX_CALLS_DEFAULT,
pszEndpoint,
pszSecurity);
if (status) exit(status);
status = RpcServerRegisterIf(hello_ServerIfHandle,
NULL,
NULL);
if (status) exit(status);
status = RpcServerListen(cMinCalls,
RPC_C_LISTEN_MAX_CALLS_DEFAULT,
fDontWait);
if (status) exit(status);
}
/******************************************************/
/* 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);
}