Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

Ссылки [ править ]

Внешние ссылки [ править ]