2009-04-14 26 views
2

私のプログラムは、プロセス間通信にMicrosoft RPCを使用します。 RPCを受信するための準備をするためには、プログラムは、次のシーケンスを実行する呼び出し:RPCサーバーの起動時に「エンドポイントは重複しています」

  1. RpcServerUseProtseqEp()、次いで

  2. RpcServerRegisterIf()、次いで

  3. RpcServerListen()

プログラムは、上記のシーケンスでRPCサーバーを起動し、しばらく動作した後、終了し、後で別のプログラムによって再起動される可能性があります。 RpcServerUseProtseqEp()のパラメータ値のセットは、プログラムが実行されるたびに同じです。

再起動後最初にシーケンスを実行すると、常に正常に終了しますが、それ以降の実行ではRPC_S_DUPLICATE_ENDPOINT( "エンドポイントは重複しています)"が返されます。現在のところ、この特定のエラーコードは無視され、 、他のすべてのプリミティブは通常正常に動作します。

RpcServerUseProtseqEp()を使用する正しい方法は何ですか?登録されたエンドポイントを取り消すか、RPC_S_DUPLICATE_ENDPOINTエラーコードを無視したままクリーンアップを行う必要がありますか?

答えて

1

私は同じ問題を抱えていた、私は完全に固定されていないことができますが、このコードは私のために動作します:あなたは、Windowsのサービスを再起動すると再び使用RpcServerUseProtseqEpまでいくつかの時間を待たなければならないいくつかの理由

UCHAR* pszProtocolSequence = (UCHAR*)"ncacn_ip_tcp"; // Use RPC over TCP/IP 
UCHAR* pszSecurity = NULL; 
UCHAR* pszEndpoint = (UCHAR*)"9300"; 
UINT cMinCalls = 1; 
UINT cMaxCalls = m_dwConcurrentChannels; 
UINT fDontWait = FALSE; 

int RPC_tries, MAX_RPC_Tries; 
RPC_tries=0; 
MAX_RPC_Tries=60; 
do 
{ 
    status = ::RpcServerUseProtseqEp(
    pszProtocolSequence, cMaxCalls, pszEndpoint, pszSecurity); 
    Sleep(1000); 
    RPC_tries+=1; 
}while(status!=RPC_S_OK && RPC_tries<MAX_RPC_Tries); 

1

私はRPCの専門家ではありませんが、サーバが終了するとRpcEpUnregisterを使用してエンドポイントを登録解除したいと考えています。この機能のためのドキュメントは、私があなたのサーバーのinstatiationsにわたって永続していると思うエンドポイントデータベースを言及します。

+0

RpcServerInqBindings()を呼び出してから、RpcEpUnregister()を呼び出しようとしました。前者は成功し、後者は「サーバーのエンドポイントが操作を実行できませんでした」を返します。 – sharptooth

関連する問題