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



         

Динамический вызов в сравнении со статическим - часть 5


// IDispatch methods... // методы IDispatch...

// IPrimeManager methods... // методы IPrimeManager... PrimeManager(void) : m_cRef(0) { ITypeLib *ptl = 0; HRESULT hr = LoadRegTypeLib(LIBID_PrimeLib, 1, 0, 0, &ptl); assert(SUCCEEDED(hr)); hr = ptl->GetTypeInfoOfGuid(IID_DIPrimeManager, &m_pTypeInfo); ptl->Release(); } virtual PrimeManager(void) { m_pTypeInfo->Release(); } };

Имея приведенное выше определение класса, метод GetTypeInfo просто возвращает описание данного интерфейса:

STDMETHODIMP PrimeManager::GetTypeInfo (UINT it, LCID lcid, ITypeInfo **ppti) { assert(it == 0 && ppti != 0); (*ppti = m_pTypeInfo)->AddRef(); return S_OK; }

Если бы объект поддерживал несколько локализованных библиотек типов, то реализации следовало бы использовать параметр LCID, чтобы решить, какое описание типа нужно возвратить. Соответствующая реализация GetTypeInfoCount еще проще:

STDMETHODIMP PrimeManager::GetTypeInfoCount(UINT *pit) { assert(pit != 0); *pit = 1; // only 0 or 1 are allowed // допускаются только 0 или 1 return S_OK; }

Единственными допустимыми значениями счетчика являются нуль (это означает, что данный объект не содержит описаний своего интерфейса) и единица (это означает, что данный объект содержит описания своего интерфейса). Даже если объект поддерживает несколько локализованных описаний типа, результирующий счетчик остается равным единице.

Методы GetTypeInfo и GetTypeInfoCount фактически являются вспомогательными. Истинным ядром интерфейса IDispatch являются методы GetIDsOfNames и Invoke. Реализация GetIDsOfNames направляет вызов в машину синтаксического анализа библиотеки типов, встроенную в СОМ:

STDMETHODIMP PrimeManager::GetIDsOfNames(REFIID riid, OLECHAR **pNames, UINT cNames, LCID lcid, DISPID *pdispids) { assert(riid == IID_NULL); return m_pTypeInfo->GetIDsOfNames(pNames, cNames, pdispids); }

Поскольку библиотека типов содержит все имена методов и соответствующие им DISPID, реализация не представляет труда для синтаксического анализатора.


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