Интерфейс > Интерфейсите на диспечера позволяват на клиентски приложения, написани на различни езици, да имат достъп до COM обекти. Да вземем, например, скриптов език като Microsoft Visual Basic Scripting Edition (VBScript), използван за инстанциране на COM компоненти, написани на C++. VBScript няма силна проверка на типове и много C++ типове са непознати за него. За да може VBScript клиент да комуникира успешно със сървър, трябва да му предоставите интерфейс за изпращане. За да направите това, достатъчно е да внедрите стандартния COM интерфейс IDispatch.
В тази стъпка ще разгледаме интерфейса на IDispatch.
По-рано говорихме за това как интерфейсите на диспечера използват технологията за автоматизация, за да осигурят взаимодействието на компоненти, написани на различни езици за програмиране.
Започвайки с тази стъпка, ще говорим за това как интерфейсът IDispatch и типът данни VARIANT се използват за достъп до COM компоненти от различни от C++ езици. А също и за това как клиентите, написани на поддържани от Microsoft езици, като Visual Basic или Microsoft Visual J++, имат директен достъп до компонентните интерфейси, без да прибягват до механизми за изпращане.
Интерфейс > Интерфейсите на диспечера позволяват на клиентски приложения, написани на различни езици, да имат достъп до COM обекти. Да вземем, например, скриптов език като Microsoft Visual Basic Scripting Edition (VBScript), използван за инстанциране на COM компоненти, написани на C++. VBScript няма силна проверка на типове и много C++ типове са непознати за него. За да може VBScript клиент да комуникира успешно със сървър, трябва да му предоставите интерфейс за изпращане. За да направите това, достатъчно е да внедрите стандартния COM интерфейс IDispatch.
Фигура 1 показва как можете да имплементирате интерфейса IDispatch за класа Encoder.
Фиг.1. Внедряване на интерфейса IDispatch
Vtable на обекта Encoder съдържа указатели към функции, реализирани в IDispatch. Клиентското приложение може да извика метода GetIDsOfNames(), като подаде името на метода като низ, като например "Encode". Методът GetIDsOfNames() създава вътрешна таблица, която свързва името на всеки метод с числов ID за изпращане - нарича се ID за изпращане или DISPID е просто число; Vпример на фигура 1, DISPID на функцията Encode е 1.
След като получи DISPID на необходимия метод, клиентското приложение извиква Invoke(), за да го изпълни. Идентификаторът за изпращане, върнат от GetIDsOfNames(), се предава като параметър при извикване на метода Invoke(). Освен това се предават параметрите за извиканите методи, опаковани в масив от променливи от тип VARIANT, както и указател към променлива от тип VARIANT, в която ще бъдат поставени стойностите, върнати от извикания метод.
Забележка. Тук е показан опростен модел на процеса на изпращане. Параметрите за извиканите методи също могат да бъдат наименувани и да имат свои собствени идентификатори за изпращане.
Версията на Invoke(), която създадохте, извиква желания метод от името на клиента за автоматизация и трябва да съдържа таблица за превод на DISPID стойностите в методите на bean. Освен това той отговаря за разопаковането на параметрите от масива VARIANT и правилното им предаване към съответния метод. Изисква се всички върнати стойности да бъдат обвити в обекта, към който сочи VARIANT, за да бъдат предадени обратно на клиента.
В следващата стъпка ще разгледаме типа данни VARIANT.