Сущность технологии COM



         

Стандартный маршалинг, потоки и протоколы - часть 6


Фильтры сообщений выставляют интерфейс 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;




Содержание  Назад  Вперед