Реферат: Перехват методов COM интерфейсов
REFIID iid, // IID интерфейса, запрашиваемого у перехватчика
void ** ppv // указатель на интерфейс перехватчика
);
Перехватчики COM+ используют информацию из библиотеки типов, чтобы определить сигнатуру метода и количество/типы параметров, а также выполнить маршалинг. Поэтому, если быть более точным, в качестве первого параметра (iidInterceptor) годятся не произвольные интерфейсы, а только те из них, которые совместимы с oleautomation и описаны в библиотеке типов.
Основной интерфейс перехватчика – ICallInterceptor, его мы и будем запрашивать в вызове CoGetInterceptor:
#include <callobj.h> CComModule _Module; int _tmain(int argc, _TCHAR* argv[]) { CoInitialize( 0); _Module.Init(0, 0 ); { CComPtr<IFoo> spFoo; HRESULT hr = spFoo.CoCreateInstance(__uuidof(Foo)); CComPtr<ICallInterceptor> spInt; hr = CoGetInterceptor(__uuidof(IFoo), 0, __uuidof(ICallInterceptor), reinterpret_cast<void**>(&spInt)); } _Module.Term(); CoUninitialize(); return 0; } |
Результатом выполнения приведенного выше приложения будет … Access Violation в недрах ntdll.dll. Этот неприятный сюрприз вызван тем, что перехватчики используют распределитель памяти RPC, который по умолчанию не проинициализирован. Исправить эту проблему можно либо с помощью вызова CoInitializeSecurity, либо вызовом любых функций маршалинга, которые проинициализируют RPC heap (есть еще вариант с прямым вызовом функции инициализации из rpcrt4.dll, но она не документирована).
ПРИМЕЧАНИЕ Проблема с инициализацией RPC-кучи была исправлена в Windows 2003 Server. |
Исправленный код клиента:
HRESULT hr = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL); К-во Просмотров: 672
Бесплатно скачать Реферат: Перехват методов COM интерфейсов
|