Страница 51 из 111
CreateDispTypelnfo Создает упрощенную информацию о типе, которую может использовать реализация IDispatch. HRESULT CreateDispTypeInfo ( INTERFACEDATA pidata, LCID kid, ITypelnfo FAR* FAR*pptinfo );
Параметры: - pidata - Описание интерфейса, для которого создается информация о типе.
- lcid - Идентификатор местности для имен, используемых в информации о типе.
- pptinfo - После возврата содержит указатель на реализацию информации о типе, которую можно использовать с DispGetlDsOfNames и Displnvoke.
Коды возврата: Из возвращенного 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; }
|