Эта статья включает в себя список общих ссылок , но он остается в значительной степени непроверенным, поскольку в нем отсутствует достаточное количество соответствующих встроенных ссылок . ( Март 2010 г. ) ( Узнайте, как и когда удалить этот шаблон сообщения ) |
IDispatch - это интерфейс, который предоставляет протокол OLE Automation . [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, имеют так называемый идентификатор отправки, который часто сокращается до DISPID. DISPID является основным средством идентификации свойства или метода и должен быть предоставлен функции Invoke для вызова свойства или метода вместе с массивом вариантов, содержащим параметры. GetIDsOfNames функция может быть использована для получения соответствующего DISPID из свойства или методы имени в струнной формате.
IDispatch является производным от IUnknown и расширяет его четырьмя дополнительными методами:
интерфейс IDispatch : общедоступный IUnknown { виртуальный HRESULT GetTypeInfoCount ( unsigned int * pctinfo ) = 0 ; виртуальный HRESULT GetTypeInfo ( unsigned int iTInfo , LCID lcid , ITypeInfo ** ppTInfo ) = 0 ; виртуальный HRESULT GetIDsOfNames ( REFIID riid , OLECHAR ** rgszNames , беззнаковый int cNames , LCID lcid , DISPID * rgDispId ) = 0 ; Виртуальный HRESULT Invoke ( DISPID dispIdMember , REFIID riid , ИЛК LCID , СЛОВО wFlags , DISPPARAMS * pDispParams , ВАРИАНТ * pVarResult , EXCEPINFO * pExcepInfo , беззнаковое INT * puArgErr ) = 0 ; };
IDispatch идентификатор интерфейса определяется как GUID со значением {00020400-0000-0000-C000-000000000046}.
Ссылки [ править ]
- ^ Microsoft MSDN: интерфейс IDispatch
- ^ Microsoft MSDN: ActiveX / COM Q&A декабрь 1995 г.
Внешние ссылки [ править ]
- DispHelper , библиотека с открытым исходным кодом, помогающая использовать IDispatch из C или C ++.
- IDispatchCodeGenerator , Генератор кода. Функция, которая добавляет IDispatch к объекту. Язык - C ++.