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

ОГЛАВЛЕНИЕ

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