Имея приведенное выше определение класса,
// 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, реализация не представляет труда для синтаксического анализатора.
Содержание Назад Вперед