Domanda

Io uso Microsoft RPC per la comunicazione interprocesso.Ho un'interfaccia con una serie di metodi di accettare un byte tubo di come una "a" parametro di IDL (descrizione):

[
    uuid(ActualGuidHere), 
    version(1.0), 
    pointer_default(unique)
]

interface IMyInterface
{
    //other irrelevant methods here
    error_status_t rpcDoAction( [in] pipe byte params );
    //more irrelevant methods here
}

ogni tanto quando invoco tali metodi su un lato del cliente attraverso un client stub generato da MIDL e delegate NdrClientCall2(), che non raggiunge il lato server, ma NdrClientCall2() restituisce RPC_S_ALREADY_LISTENING ("Il server è già in ascolto") che è davvero fonte di confusione.

Ho aggiunto la registrazione in funzioni utilizzate per spingere/tirare durante le operazioni di trasferimento - non sono mai chiamati per una qualsiasi delle chiamate che non riescono in questo modo.Questo implica che la trasmissione non è ancora iniziato.

Non incontro mai un tale comportamento quando la chiamata di metodi che non hanno i tubi come parametri.

Quale potrebbe essere il motivo e la soluzione?

È stato utile?

Soluzione

La documentazione sembra abbastanza minimal - non credo che c'è una vasta comunità di utenti per diretta l'uso della RPC Api - ma la mia ipotesi è che, al fine di impostare il tubo parametro, è necessario per RPC per chiamare internamente RpcServerListen.Solo una chiamata alla API è in grado di bloccare in un momento.

Il fatto che si vede il problema, solo occasionalmente, suggerisce che è legata al tempo, quindi è possibile che si stanno facendo due chiamate su thread diversi e, a volte saranno simultanea?

Uno che o c'è una tempistica bug correlati RPC biblioteca di attuazione e si dovrà ovviare a questo nuovo tentativo di chiamata (che può essere una soluzione efficace, in ogni caso).

Altri suggerimenti

credo che questo non deve essere trattata come un problema. Vedere PRB: CoCreateInstance non riesce in server RPC < br>

Visualizza anche questo: Come Registrarsi RPC multipla interfacce server

[UPDATE] Forse c'è problema nel rilascio di memoria. Vedi gli esempi di implementazione di PIPE e controllare la vostra codice.
Implementazione Tubi di ingresso sul client
Implementazione Pipes uscita sul client
Implementazione Tubi di ingresso sul server
Implementazione Tubi di output sul server

In bocca al lupo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top