Реферат: Перехват методов COM интерфейсов

private:

CComPtr<IStream> m_spStm;

CComBSTR m_name;

};

HRESULT CreateStreamOnHGlobal2(HGLOBAL hGlobal,BOOL fDeleteOnRelease,

LPOLESTR name, LPSTREAM* ppstm)

{

CComObject<StreamOnMemory>* p = NULL;

HRESULT hr = CComObject<StreamOnMemory>::CreateInstance(&p);

if(SUCCEEDED(hr))

{

CComPtr<IStream> spStm = p;

hr = p->init(hGlobal, fDeleteOnRelease, name);

if(SUCCEEDED(hr))

{

*ppstm = spStm.Detach();

}

}

return hr;

}

При таком подходе нет необходимости вносить какие-либо изменения в клиентский код, работающий с указателями на интерфейс IStream.

ПРИМЕЧАНИЕ

За исключением кода, создающего поток с помощью вызова CreateStreamOnHGlobal.

Такой “частный” подход неприменим, когда количество перехватываемых интерфейсов велико, или если информация об интерфейсах и сигнатурах их методов недоступна во время компиляции и станет известна только во время выполнения программы. Например, typelib-маршалинг в COM предоставляет клиенту Proxy-компонент, поддерживающий интерфейс серверного компонента, но обеспечить реализацию этого интерфейса инфраструктура COM может только во время выполнения – на этапе компиляции неизвестно, какие интерфейсы будут использоваться для typelib-маршалинга.

Разумеется, лучше было бы реализовать универсальный перехват вызовов COM-методов. Но при этом мы столкнемся с несколькими проблемами:

заранее неизвестно количество методов в произвольном интерфейсе, т.е. структура vtbl;

неизвестны сигнатуры индивидуальных методов, входящих в интерфейс, т.е. количество и типы параметров.

Решить указанные проблемы, используя только средства языков высокого уровня, не удастся. Мы могли бы попытаться обойти отсутствие информации о сигнатурах методов путем объявления функции с переменным количеством параметров:

void f(int a, ...);

Но такие функции используют соглашение о вызове cdecl, а методы COM-интерфейсов – stdcall.

К-во Просмотров: 661
Бесплатно скачать Реферат: Перехват методов COM интерфейсов