3

私のプログラムは、プロセス間通信に Microsoft RPC を使用しています。RPC 呼び出しの受信を準備するために、プログラムは次のシーケンスを実行します。

  1. RpcServerUseProtseqEp()、次に

  2. RpcServerRegisterIf() の場合

  3. RpcServerListen()

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

シーケンスが再起動後に初めて実行されるときは常に成功しますが、その後の実行では RpcServerUseProtseqEp() は RPC_S_DUPLICATE_ENDPOINT を返します (「エンドポイントは重複しています。」) 現在、この特定のエラー コードを無視して成功として扱います。他のプリミティブは通常正常に動作します。

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

4

2 に答える 2

1

私は同じ問題を抱えていました。完全に修正することはできませんが、このコードは私にとってはうまくいきます:

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);

何らかの理由で、Windows サービスを再起動するときに RpcServerUseProtseqEp を再度使用するまでしばらく待つ必要があります。

于 2010-10-26T14:25:50.797 に答える
1

私は RPC の専門家ではありませんが、サーバーの終了時にRpcEpUnregisterを使用してエンドポイントの登録を解除することをお勧めします。この関数のドキュメントには、サーバーのインスタンス間で永続化されていると思われるエンドポイント データベースが記載されています。

于 2009-04-14T09:21:46.660 に答える