. ORPC , . , , , , , .
, RPC- , RPC- . RTA, RPC- ncalrpc, LPC (local procedure call - ) Windows NT. - STA, , MSG Windows. , , . , MSG Windows, RPC. , , RPC , . , RPC . / , . , . , RPC , . , RPC , ORPC- , , Windows MSG, .
ORPC- . ORPC- IPID ( ) . , , RTA, IRpcStubBuffer::Invoke . RTA, . , . RTA/MTA- RPC , . RTA , .
STA , STA . , ORPC- , RPC , STA . STA STA, RPC- I- PostMessage, MSG- STA- , . 5.5. FIFO (first-in, first-out), . , STA- :
MSG msg; while (GetMessage(&msg, 0, , 0)) DispatchMessage(&msg);
, STA- , . STA CoInitializeEx, , CreateWindowEx. , WndProc ORPC- IRpcStubBuffer::Invoke . , , STA, , WndProc . , Windows 95 RPC- , RPC- PostMessage . , , , API- PostMessage .
( )1. , , ORPC- . , . , CLSID_Callback , , CLSID_Object , :
ICallback *pcb = 0; HRESULT hr = CoCreateInstance(CLSID_Callback, 0, CLSCTX_ALL, IID_ICallback, (void**)&pcb); assert(SUCCEEDED(hr)); // callback object lives in this apt. // I0bject "po = 0; hr = CoCreateInstance(CLSID_Object, 0, CLSCTX_REMOTE_SERVER, IID_Iobject, (void **)&po); assert(SUCCEEDED(hr)); // object lives in different apt. // // make a call to remote object, marshaling a reference to // the callback object as an [in] parameter // , // [in]- hr = po->UseCallback(pcb); // clean up resources // pcb->Release(); pco->Release();
. 5.6 , , UseCallback :
STDMETHODIMP Object::UseCallback(ICallback *pcb) { HRESULT hr = pcb->GetBackToCallersApartment(); assert(SUCCEEDED(hr)); return S_OK;
, [in]- UseCallback, CoMarshalInterface ICallback. , , . IObject ICallback, UseCallback. , . / , AddRef 2:
STDMETHODIMP Object::UseCallback(ICallback *pcb) { if (!pcb) return E_INVALIDARG; // hold onto proxy for later use // (m_pcbMyCaller = pcb)->AddRef(); return S_OK; }
, . ORPC- , .
- . , - , . , - ORPC- . RPC- , , . , ORPC- , . RTA , RTA, , , RTA . , RTA, RPC- , ORPC- , RTA RTA.
STA . STA- , STA, , ORPC- . SendReceive, ORPC- ORPC- , MSG- . , . . , . , , ORPC- . ORPC- , ORPC- . .
STA. STA, , ORPC- . , , STA ORPC- . IMessageFilter:
[ uuid(00000016-0000-0000-C000-000000000046),local, object ] interface IMessageFilter : IUnknown { typedef struct tagINTERFACEINFO { IUnknown *pUnk; // which object? // ? IID iid; // which interface? // ? WORD wMethod; // which method? // ? } INTERFACEINFO; // called when an incoming ORPC request arrives in an STA // , ORPC- STA DWORD HandleInComingCall( [in] DWORD dwCallType, [in] HTA5K dwThreadIdCaller, [in] DWORD dwTickCount, [in] INTERFACEINFO *pInterfaceInfo ); // called when another STA rejects or postpones an ORPC request // , STA ORPC- DWORD RetryRejectedCall( [in] HTASK dwThreadIdCallee, [in] DWORD dwTickCount, [in] DWORD dwRejectType ); // called when a non-COM MSG arrives while the thread is // awaiting an ORPC response // , ' MSG, // ORPC- DWORD MessagePending( [in] HTASK dwThreadIdCallee, [in] DWORD dwTickCount, [in] DWORD dwPendingType ); }
API- CoRegisterMessageFilter:
HRESULT CoRegisterMessageFilter([in] IMessageFilter *pmfNew, [out] IMessageFilter **ppmfOld);
CoRegisterMessageFilter STA. , .
ORPC- STA- , HandleIncomingCall, , . HandleIncomingCall , . dwCallType , :
typedef enum tagCALLTYPE { CALLTYPE_TOPLEVEL, // STA not in outbound call // STA CALLTYPE_NESTED, // callback on behalf of outbound call // CALLTYPE_ASYNC, // asynchronous call // CALLTYPE_TOPLEVEL_CALLPENDING, // new call while waiting // CALLTYPE_ASYNC_CALLPENDING // async call while waiting // } CALLTYPE;
( ) ( ) , ORPC- . , .
, HandleIncomingCall, , :
typedef enum tagSERVERCALL { SERVERCALL_ISHANDLED, // accept call and forward to stub // SERVERCALL_REJECTED, // tell caller that call is rejected // , SERVERCALL RETRYLATER // tell caller that call is postponed // , } SERVERCALL;
HandleIncomingCall SERVERCALL_ISHANDLED, . , , SERVERCALL_ISHANDLED. HandleIncomingCall SERVERCALL_REJECTED SERVERCALL_RETRYLATER, ORPC- .
, RetryRejectedCall. , RetryRejectedCall , . dwRejectType , . , , , RetryRejectedCall. RetryRejectedCall -1, , , HRESULT, RPC_E_CALL_REJECTED. -1. , RetryRejectedCall, , . , ORPC- . , .
STA ORPC- , MSG- . , STA MessagePending. , , , . , ( , , ) , . , STA RTA . , . , . , , , , , , . . , . .
1 . , , .
2 , (Connection Points). 7, Visual Basic .