,

,

. 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 , .

 . 5.5.

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; 

 . 5.6.

, [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 .



Suschnost' tehnologii SOM
Essential COM
ISBN: 0201634465
EAN: 2147483647
Year: N/A
Pages: 103
Authors: Don Box

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net