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



         

Вспомогательные средства для внутрипроцессного маршалинга - часть 5


Следующий код корректно демаршалирует объектную ссылку и может вызываться из любого апартамента одного и того же процесса:

HRESULT ReadPtrFromGlobalVariable(IRacer * &rpRacer, bool bLastUnmarshal) { // where to write the marshaled ptr // куда записывать маршалированный указатель extern DWORD g_dwCookie; // thread synchronization // синхронизация потока extern HANDLE g_heventWritten; // wait for other thread to signal that ptr is available // ожидаем другой поток, чтобы сигнализировать о доступности указателя WaitForSingleObject(g_heventWritten, INFINITE); // read marshaled object reference from global variable // читаем маршалированную объектную ссылку из глобальной переменной HRESULT hr = g_pGIT->GetInterfaceFromGlobal( g_dwCookie, IID_IRacer, (void**)&rpRacer); // if we are the last to unmarshal, revoke the pointer // если мы поспедние в очереди на демаршапинг, то // аннулируем указатель if (bLastUnmarshal) g_pGIT->RevokeInterfaceFromGlobal(g_dwCookie); return hr; }

Отметим принципиальную разницу между этими фрагментами кода и примерами с применением CoMarshalInterThreadInterfaceInStream. Она состоит в том, что код, основанный на GIT, способен демаршалировать более чем один заместитель.

1 Может показаться странным, что глобальная переменная является интерфейсным указателем, который инициализирован в апартаменте программы записи, а используется из апартамента программы считывания. Об этой противоречивости упоминается в документации по CoMarshalInterThreadInterfaceInStream, где формулируется, что к результирующему интерфейсному указателю IStream можно обратиться из любого апартамента в процессе.




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