Отправлять
Эта статья включает список общих ссылок , но в ней отсутствуют достаточные соответствующие встроенные цитаты . ( Март 2010 г. ) |
IDispatch — это интерфейс , предоставляющий протокол OLE-автоматизации . [1] Расширение IUnknown , это один из стандартных интерфейсов, который может быть предоставлен COM- объектами. COM различает три типа интерфейсов: пользовательский , представляющий собой интерфейс IUnknown на основе VTABLE, диспетчерский , представляющий собой интерфейс IDispatch, поддерживающий самоанализ, и двойные интерфейсы, поддерживающие оба типа.
Интерфейс автоматизации (IDispatch) позволяет клиентскому приложению узнать, какие свойства и методы поддерживаются объектом во время выполнения, т.е. реализует концепцию RTTI . Он также предоставляет информацию, необходимую для вызова этих свойств и методов. Клиентским приложениям не обязательно знать о членах объекта при их компиляции. Это позволяет объектам COM и ActiveX вызываться с помощью платформ программ сценариев, таких как сервер ASP и JavaScript в Internet Explorer , где соглашения о вызовах не были известны на момент IIS создания или IE. Напротив, простая библиотека объектов компилируется и компонуется с программой, например, вызов DLL должен знать имя функции и параметры во время компиляции.
Автор сценария может запросить у COM-объекта метод или свойство, о которых он уже знает из документации. Затем клиент может выполнить функцию с помощью Invoke, предоставляемого интерфейсом IDispatch, что является формой позднего связывания . Подобная возможность также поддерживалась динамическим обменом данными (DDE), который так и не стал популярным из-за слишком низкого уровня.
Интерфейсы диспетчеризации являются гибкими, но страдают от дополнительных затрат на самоанализ и вызовы по сравнению с пользовательскими интерфейсами. [2] Поэтому зачастую хорошей идеей является поддержка обоих типов интерфейсов с помощью двойных интерфейсов. Таким образом, клиенты, поддерживающие вызов на основе VTABLE, могут использовать собственный интерфейс вместо аналога диспетчеризации .
Методы
[ редактировать ]Каждое свойство и метод, реализованные объектом, поддерживающим интерфейс IDispatch, имеют так называемый идентификатор Dispatch ID, который часто сокращается до DISPID. DISPID является основным средством идентификации свойства или метода и должен быть передан в функцию Invoke для вызова свойства или метода вместе с массивом вариантов , содержащих параметры. Функцию GetIDsOfNames можно использовать для получения соответствующего DISPID из имени свойства или метода, имеющего строковый формат.
IDispatch является производным от IUnknown и расширяет его четырьмя дополнительными методами:
interface IDispatch : public IUnknown {
virtual HRESULT GetTypeInfoCount(unsigned int * pctinfo) = 0;
virtual HRESULT GetTypeInfo(unsigned int iTInfo,
LCID lcid,
ITypeInfo ** ppTInfo
) = 0;
virtual HRESULT GetIDsOfNames(REFIID riid,
OLECHAR ** rgszNames,
unsigned int cNames,
LCID lcid,
DISPID * rgDispId
) = 0;
virtual HRESULT Invoke(DISPID dispIdMember,
REFIID riid,
LCID lcid,
WORD wFlags,
DISPPARAMS * pDispParams,
VARIANT * pVarResult,
EXCEPINFO * pExcepInfo,
unsigned int * puArgErr
) = 0;
};
Идентификатор IDispatch интерфейса определяется как GUID со значением {00020400-0000-0000-C000-000000000046}.
Ссылки
[ редактировать ]- ^ Microsoft MSDN: интерфейс IDispatch
- ^ Microsoft MSDN: Вопросы и ответы по ActiveX/COM, декабрь 1995 г.
Внешние ссылки
[ редактировать ]- DispHelper — библиотека с открытым исходным кодом, помогающая использовать IDispatch из C или C++.