Позволяет создать стандартную реализацию 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; };