Шаг 52 - CreateStdDispatch

Позволяет создать стандартную реализацию IDispatch одним вызовом функции.

HRESULT CreateStdDispatch
(
	IUnknown FAR* punkOuter,
	void FAR*pvThis,
	ITypelnfo FAR*ptinfo,
	IUnknown FAR* FAR* ppunkStdDisp
);

Параметры:

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

Код возвратаЗначение
S_OKУспех.
E_INVALIDARGОдин из первых трех параметров неверен.
E_OUTOFMEMORYHe хватает памяти для выполнения операции.

Комментарии:
При создании объекта вместо того, чтобы реализовывать для него функции-члены IDispatch, Вы можете прибегнуть к CreateStdDispatch. Однако создаваемая этой функцией реализация имеет следующие ограничения:

Пример:
Следующий фрагмент кода реализует интерфейс 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;
};

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