Шаг 51 - CreateDispTypelnfo

Создает упрощенную информацию о типе, которую может использовать реализация IDispatch.

HRESULT CreateDispTypeInfo
(
	INTERFACEDATA  pidata,
	LCID kid,
	ITypelnfo FAR* FAR*pptinfo
);

Параметры:

Коды возврата:
Из возвращенного HRESULT получают один из следующих кодов возврата:

Код возвратаЗначение
S_OKИнтерфейс поддерживается.
E_INVALIDARGЛибо описание интерфейса, либо LCID неверны.
E_OUTOFMEMORYHe хватает памяти для выполнения операции.

Комментарии:
Вы можете создать информацию о типе во время исполнения, используя 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;
}

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 02.03.2002