Страница 52 из 111 CreateStdDispatch Позволяет создать стандартную реализацию IDispatch одним вызовом функции. HRESULT CreateStdDispatch ( IUnknown FAR* punkOuter, void FAR*pvThis, ITypelnfo FAR*ptinfo, IUnknown FAR* FAR* ppunkStdDisp );
Параметры: - punkOuter - Указатель на реализацию IUnknown для объекта.
- pvThis - Указатель на предоставляемый объект.
- ptinfo - Указатель на информацию о типе, описывающую предоставляемый объект.
- ppunkStdDisp - Возвращаемый интерфейс IUnknown объекта, который реализует IDispatch. В случае ошибки указатель равен NULL.
Коды возврата: Из возвращенного HRESULT получают один из следующих кодов возврата: Код возврата | Значение | S_OK | Успех. | E_INVALIDARG | Один из первых трех параметров неверен. | E_OUTOFMEMORY | He хватает памяти для выполнения операции. | Комментарии: При создании объекта вместо того, чтобы реализовывать для него функции-члены IDispatch, Вы можете прибегнуть к CreateStdDispatch. Однако создаваемая этой функцией реализация имеет следующие ограничения: - Поддерживает только один национальный язык.
- Поддерживает возврат из Invoke только стандартных кодов исключений.
- LoadTypeLib, GetTypelnfoOfGuid и CreateStdDispatch составляют минимальный набор функций, которые Вам необходимо вызывать для предоставления объекта с использованием библиотеки типа. Подробнее о LoadTypeLib и GetTypelnfoOfGuid.
- CreateDispTypelnfo и CreateStdDispatch составляют минимальный набор диспетчерских компонентов, которые необходимо вызывать для предоставления объекта с использованием информации о типе, заданной в структуре INTERFACEDATA.
Пример: Следующий фрагмент кода реализует интерфейс IDispatch для класса CCalc с помощью CreateStdDispatch. CCalc FAR* CCalc::Create() { HRESULT hresult; CCalc FAR* pcalc; CArith FAR* parith; ITypelnfo FAR* ptinfo; IUnknown FAR* punkStdDisp; extern INTERFACEDATA NEARDATA g_idataCCalc;
if ((pcalc = new FAR CCalc()) == NULL) return NULL; pcalc->AddRef(); parith = &(pcalc->m_arith);
// Построить информацию о типе для функциональности объекта, к которой // предоставляется программный доступ извне.
hresult = CreateDispTypeInfo(&g_idataCCalc, LOCALE_SYSTEM_DEFAULT, &ptinfo); if(hresult != NOERROR) goto LErrorO;
// Создать агрегат с экземпляром стандартной реализации // IDispatch, инициализированной нашей информацией о типе.
hresult = CreateStdDispatch(pcalc,// Управляющий IUnknown. parith,// Экземпляр для распределения вызовов. ptinfo,// Информация о типе, описывающая экземпляр. &punkStdDisp);
ptinfo->Release(); if(hresult != NOERROR) goto LErrorO; pcalc->m_punkStdDisp = punkStdDisp; return pcalc; LErrorO:; pcalc->Release(); return NULL; }; |