Шаг 55 - Displnvoke

Автоматически вызывает функции-члены по информации о типе для интерфейса. Вы можете описать интерфейс с помощью информации о типе и реализовать IDispatch::Invoke одним вызовом этой Displnvoke.

HRESULT Displnvoke
( 
	void FAR* _this, 
	ITypelnfo FAR* ptinfo, 
	DISPID dispidMember, 
	unsigned short wFlags, 
	DISPPARAMS FAR*pparams, 
	VARIANT FAR* pvarResult, 
	EXCEPWFO pexeepinfo, 
	unsigned int FAR* puArgErr 
);

Параметры:

Код возвратаЗначение
S_OK Успех.
DISP_E_BADPARAMCOUNTЧисло аргументов в DISPPARAMS отличается от фактического числа аргументов метода или свойства.
DISP_E_BADVARTYPEОдин из аргументов в DISPPARAMS имеет неверный тип варианта.
DISP_E_EXCEPTIONПриложению необходимо возбудить исключение. В данном случае структура pexcepinfo должна быть заполнена.
DISP_E_MEMBERNOTFOUND Запрошенный член не существует.
DISP_E_NONAMEDARGS Данная реализация IDispatch не поддерживает именованные аргументы.
DISP_E_OVERFLOWОдин из аргументов в DISPPARAMS невозможно привести к заданному типу.
DISP_E_PARAMNOTFOUNDОдин из DISPID параметров не соответствует ни одному из параметров метода. В данном случае puArgErr устанавливается на первый аргумент, вызвавший ошибку.
DISP_E_PARAMNOTOPTIONALНе задан обязательный параметр.
DISP_E_TYPEMISMATCH Приведение типа для одного или нескольких аргументов невозможно. Индекс первого параметра в массиве rgvarg, имеющего неверный тип, возвращается в puArgErr.
E_INVALIDARG Один из параметров неверен.
E_OUTOFMEMORYНе хватает памяти для выполнения операции.
ДругиеМогут также возвращаться любые коды возврата ITypeInfo::Invoke.

Комментарии:
Параметр _this представляет собой указатель на реализацию интерфейса, к которому выполняется обращение. Displnvoke строит стековый фрейм, преобразует параметры по стандартным правилам приведения типов, помещает их в стек и затем вызывает соответствующую функцию-член в VTBL.

Пример:
Следующий код из примера Lines (файл Lines.cpp) реализует IDispatch::Invoke с помощью Displnvoke. Эта функция использует m_bRaiseException для сигнализации о том, что во время вызова Displnvoke произошла ошибка.

STDMETHODIMP CLines::Invoke
(
	DISPID dispidMember,
	REFIID riid,
	LCID Icid,
	WORD wFlags,
	DISPPARAMS FAR* pdispparams,	
	VARIANT FAR* pvarResult,
	EXCEPINFO FAR* pexcepinfo,
	UINT FAR* puArgErr) 
{
	return DispInvoke( this, m_ptinfo,dispidMember, wFlags, pdispparams,
		pvarResult,  pexcepinfo,  puArgErr);   
}

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