Реализация доступа к СОМ компонентам из Visual C#

Автор: Topol Пятница, Июнь 8th, 2012 Нет комментариев

Рубрика: Программирование

Как известно, СОМ-объекты и программное обеспечение Microsoft Visual Basic – это две совершенно разные сферы. Сама аббревиатура СОМ расшифровывается как Component Object Model, что в переводе с английского языка означает «объектная модель компонентов». Это, по сути, некоторый стандарт, который действует в области Микрософт. COM – это программное обеспечение, которое позволяет связывать все компоненты программы независимо от их места положения. Также «ком» способен использовать одни и те же компоненты в разных программах одновременно. Однако, вопреки всему, все же нашелся способ взаимодействия между СОМ и Visual Basic напрямую, не применяя при этом дополнительных механизированных интерфейсов.

Ярким примером подобного подхода может послужить интерфейс, который называется «IDispatch». Эта программа способна напрямую общаться с СОМ компонентами, через написанные сценарии на языке Visual С++. Для того чтобы VBScript успешно осуществил связь с сервером, необходимо ему предоставить диспетчерский интерфейс (на английском это будет звучать так «dispatch interface»). Чтобы проделать эту операцию, нужно всего лишь реализовать стандарты интерфейса СОМ в IDispatch. Иногда приходится создавать COM объекты, которые должны быть доступны исключительно для клиентов Visual С++. Такое решение не требует реализации стандартных компонентов интерфейса IDispatch. Таким приемом пользуются в узких кругах в сфере какой-либо одной компании. Но все же если вы хотите, чтобы объект был доступен для большего количества языков, то вам придется проделать эту процедуру. Однако, стоит запомнить, что осуществление данной процедуры и обмен параметрами возможны лишь при наличие у обеих сторон работающей функции Automation. Сюда можно отнести только те параметры, которые поддаются упаковке в формат VARIANT – тип Com объединения. Таким образом, открываются следующий перечень функций для дальнейшего обмена параметрами.

Рассмотрим на конкретном примере реализацию IDispatch для класса Encoder. Таблица vtable, которая содержит все указатели на функции, реализована в IDispatch. Таким образом, приложение может запустить метод GetIDsOfNames(), который будет отображаться в виде строки «Encode». В имеющемся методе создается таблица, связывающая имя каждого метода с каждым числом диспетчерского идентификатора, который часто называют DISPID. Получив необходимый метод, нам нужно его запустить. Запуск производится через клиентское приложение посредством Invoke(). Далее происходит обмен информацией, точнее начало обмена. Возвращенный метод GetIDsOfNames() далее передается в виде параметра вызываемого Invoke(). Из массива VARIANT параметры передаются переменной VARIANT в возвращенный метод. Это упрощенная схема передачи данных. Все гораздо сложнее, если параметры вызываемых методов будут обладать индивидуальными идентификаторами Dispatch ID.

Источник: cisharp.com

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты