Справочник по технологии COM
Страница 51. CreateDispTypelnfo


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;
}

 
Следующая статья »