Шаг 52 - CreateStdDispatch.

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

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

Параметры
punkOuter
Указатель на реализацию IUnknown для объекта.
pvThis
Указатель на предоставляемый объект.
ptinfo
Указатель на информацию о типе, описывающую предоставляемый объект.
ppunkStdDisp
Возвращаемый интерфейс IUnknown объекта, который реализует IDispatch. В случае ошибки указатель равен NULL.

Коды возврата
Из возвращенного HRESULT получают один из следующих кодов возврата:
Код возврата Значение
S_OK Успех.
E_INVALIDARG Один из первых трех параметров неверен.
E_OUTOFMEMORY He хватает памяти для выполнения операции.

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

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