C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  Update World C++: Сборник GPL QT исходников
  Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Letyshops [lifetime]

 55 - Displnvoke / COM-справка / Приложение

Шаг 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 
);

Параметры:

  • _this - Указатель на реализацию интерфейса IDispatch, которую описывает ptinfo.
  • ptinfo - Указатель на информацию о типе, описывающую интерфейс.
  • dispidMember - Задает вызываемый член. Для определения значения DISPID используйте GetlDsOfNames или документацию к объекту.
  • wFlags - Флаги, описывающие контекст вызова Invoke:

    ЗначениеОписание
    DISPATCH_METHODЧлен вызывается как метод. Если свойство имеет то же самое имя, то могут быть установлены и этот флаг, и флаг DISPATCH_PROPERTYGET.
    DISPATCH_PROPERTYGETЧлен считывается как свойство или элемент данных.
    DISPATCH PROPERTYPUTЧлен изменяется как свойство или элемент данных.
    DISPATCH_PROPERTYPUTREFЧлен изменяется путем присваивания ссылки, а не значения. Данный флаг допустим только тогда, когда свойство допускает ссылку на объект.

  • pparams - Указатель на структуру, содержащую массив аргументов, массив DISPID для именованных аргументов и счетчик элементов в массивах.
  • pvarResult - Указатель, по которому должен возвращаться результат, или NULL, если вызывающий не ожидает возврата результата. Если задано DISPATCH_PROPERTYPUT или DISPATCH_PROPERTYPUTREF, данный аргумент игнорируется.
  • pexcepmfo - Указатель на структуру, содержащую информацию об исключении. Если возвращается DISP_E_EXCEPTION, эта структура должна быть заполнена.
  • puArgErr - Индекс в rgvarg, соответствующий первому аргументу, который вызвал ошибку. Аргументы хранятся в pdispparams->rgvarg в обратном порядке, так что первому аргументу соответствует наибольший индекс массива. Значение параметра возвращается только в том случае, если код возврата равен DISP_E_TYPEMISMATCH или DISP_E_PARAMNOTFOUND.

Код возвратаЗначение
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);   
}

| |
Автор Каев Артем.
[AD]





Letyshops [lifetime]