次の方法で共有


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

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

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

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

サーバーは RpcServerUseProtseqEp および RpcServerRegisterIf の RPC ランタイム関数を呼び出して、バインディング情報をクライアントで使用できるようにします。 このプログラム例では、インターフェイス ハンドル名を 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>
#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);
}