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