次の方法で共有


サーバー アプリケーション

次の例は、プラットフォーム ソフトウェア開発キット (SDK) の RPC\Hello ディレクトリにある "Hello World" アプリケーションの例です。 分散アプリケーションのサーバー側は、そのサービスが使用可能であることをシステムに通知します。 その後、クライアント要求を待機します。 MIDL コンパイラは、次の例と共に使用する必要があります。

アプリケーションのサイズとコーディング設定に応じて、1 つ以上の個別のファイルにリモート プロシージャを実装することを選択できます。 このチュートリアル プログラムでは、ソース ファイル Hellos.c にメイン サーバー ルーチンが含まれています。 Hellop.c ファイルにはリモート プロシージャが含まれています。

リモート プロシージャを別々のファイルに整理する利点は、プロシージャをスタンドアロン プログラムとリンクして、分散アプリケーションに変換する前にコードをデバッグできることです。 スタンドアロン・プログラムでプロシージャーが機能したら、リモート・プロシージャーを含むソース・ファイルをコンパイルして、サーバー・アプリケーションとリンクすることができます。 クライアント アプリケーション ソース ファイルと同様に、サーバー アプリケーション ソース ファイルには Hello.h ヘッダー ファイルを含める必要があります。

サーバーは RPC ランタイム関数 RpcServerUseProtseqEpRpcServerRegisterIf を呼び出して、バインド情報をクライアントで使用できるようにします。 このプログラム例では、インターフェイス ハンドル名を RpcServerRegisterIf に渡します。 他のパラメーターは NULL に設定されます。 その後、サーバーは RpcServerListen 関数を呼び出して、クライアント要求を待機していることを示します。

サーバー アプリケーションには、サーバー スタブが呼び出す 2 つのメモリ管理機能 ( midl_user_allocatemidl_user_free) も含める必要があります。 これらの関数は、リモート プロシージャがパラメーターをサーバーに渡すときに、サーバーにメモリを割り当てて解放します。 このサンプル プログラムでは、 midl_user_allocatemidl_user_free は、単に C ライブラリ関数 mallocfree のラッパーです。 (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);
}