Реферат: Перехват методов 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 интерфейсов
|