Создает упрощенную информацию о типе, которую может использовать реализация IDispatch.
HRESULT CreateDispTypeInfo ( INTERFACEDATA pidata, LCID kid, ITypelnfo FAR* FAR*pptinfo );
Параметры:
Коды возврата:
Из возвращенного HRESULT получают один из следующих кодов возврата:
Код возврата | Значение |
---|---|
S_OK | Интерфейс поддерживается. |
E_INVALIDARG | Либо описание интерфейса, либо LCID неверны. |
E_OUTOFMEMORY | He хватает памяти для выполнения операции. |
Комментарии:
Вы можете создать информацию о типе во время исполнения, используя CreateDispTypelnfo и структуру INTERFACEDATA, которая описывает предоставляемый объект.
Информация о типе, возвращаемая данной функцией, предназначена главным образом для того, чтобы автоматизировать реализацию IDispatch. CreateDispTypelnfo возвращает не всю информацию о типе. Аргумент pidata — это не полное описание интерфейса. Он не содержит информации для справочной системы, комментариев, необязательных параметров и другой информации о типе, полезной в иных контекстах.
В связи с этим рекомендуется использовать другой способ предоставления информации о типе для объекта, а именно описание объекта на языке ODL и компиляцию этого описания в библиотеку типа с помощью компилятора MIDL или утилиты MkTypLib.
Вы можете воспользоваться информацией из библиотеки типа с помощью функций LoadTypeLib и GetTypelnfoOfGuid вместо CreateDispTypelnfo.
Пример:
Приведенный ниже код создает информацию о типе из INTERFACEDATA для предоставления объекта CCalc.
static METHODDATA NEARDATA rgmdataCCalc [] = { PROPERTY(VALUE,IMETH_ACCUM,IDMEMBER.ACCUM,VT_I4) PROPERTY(ACCUM,IMETH_ACCUM,IDMEMBER_ACCUM,VT_I4) PROPERTY(OPND,IMETH_OPERAND,IDMEMBER_OPERAND,VT_I4) PROPERTY(OP,IMETH_OPERATOR,IDMEMBER_OPERATOR,VT_I2) METHODO(EVAL,IMETH_EVAL,IDMEMBER_EVAL,VT_BOOL) METHODO(CLEAR,IMETH_CLEAR,IDMEMBER_CLEAR,VT_EMPTY) METHODO(DISPLAY,IMETH_DISPLAY,IDMEMBER_DISPLAY,VT_EMPTY) METHODO(QUIT,IMETH_QUIT,IDMEMBER_QUIT,VT_EMPTY) METHOD1(BUTTON,IMETH_BUTTON,IDMEMBER_BUTTON,VT_BOOL) } INTERFACEDATA NEARDATA g_idataCCalc = { rgmdataCCalc, DIM(rgmdataCCalc) } // Реализация IDispatch с помощью диспетчерских функций API. 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; }