
- •Добавление к com-серверу поддержки событий
- •Создание модели взаимодействия приложения хоста с плагинами
- •Описание com-интерфейсов, связанных с поддержкой плагинов
- •Создание com-интерфейсов, связанных с поддержкой плагинов
- •Создание com-классов, связанных с поддержкой плагинов
- •Создание класса, отвечающего за взаимодействие с плагинами
- •Код класса Plugin.Cs
- •Внесение косметических изменений в серверную часть
- •Строим своё меню с плагинами и идентификаторами
- •Вносим изменения в главную форму сервера
- •Создание первого плагина
- •Импорт типов с сервера
- •Создание класса для хранения внутреннего представления точек
- •Создание форм редактирования данных о точках
- •Реализация форм редактирования данных о точках
- •Реализация класса первого плагина
- •Создание третьего плагина
- •Делаем наш плагин com-видимым
- •Создание главной формы плагина
- •Реализация класса третьего плагина
- •Создание инсталлятора для плагина
- •Создание второго плагина
- •Создание главной формы плагина
- •Создание библиотеки типов
- •Реализация формы второго плагина
- •Реализация класса второго плагина
- •Добавление метода GetComClassName
- •Data Execution Prevention и его отключение
- •Тестирование совместной работы клиента и плагинов
- •Исходный код
Создание второго плагина
Изначально по ТЗ было необходимо обеспечить COM-взаимодействие с кодом, написанным в среде, отличной от среды COM-сервера. Это внушало иллюзию выбора – будто бы таких сред много и можно разгуляться. Но проблема в том, что, к моему стыду, опыт кодинга на плюсах у меня очень небольшой и систем разработки, заточенных под С++, я знаю действительно очень мало.
В Java с COM вообще всё плохо, ибо идеология слишком платформонезависима, а COM – технология всё-таки майкрософтская, проприетарная. Того COM-взаимодействия, которое я увидел в Java, мне вроде бы как не хватило бы для создания плагинов. Там можно было использовать COM-объекты других серверов автоматизации, но с созданием своих серверов возникли бы проблемы.
Я пробовал создавать плагин на Qt, но там большие траблы с одновременным использованием внешних COM-объектов и созданием сервера для экспорта вовне своих внутренних. То есть, в Qt, при условии, что вы создаёте только один проект, вы легко можете либо быть клиентом, используя внешние COM-классы, либо быть сервером и только предоставлять на экспорт свои классы. А наша библиотека должна одновременно поставлять вовне реализацию IPlugin-а и юзать интерфейсы и объекты сервера. Наверное я бы и нашел решение, может быть как-нибудь задействовав ATL либо разбив одну библиотеку на несколько, но у меня было мало времени.
В конце концов я стал писать в допотопном Borland C++ Builder. Заставлять вас писать на Delphi, пожалуй, было бы слишком по-садистски. Найдите где-нибудь рабочую копию этой программы, будьте добры.
Внимание: я использовал Borland C++ Builder 6.0 Enterprise Suite. Он довольно глючный! Запускать его лучше всегда с правами администратора, ибо в то время, когда он вышел, винда ещё позволяла программам делать многие действия, которые сейчас непозволительны без прав администратора. Сохранять код лучше почаще.
Кроме того, нам потребуется какой-нибудь внешний редактор, ибо билдер часто заменяет некоторые автоматически создаваемые им файлы, а их сгенерированное содержимое нас не устраивает, его придется менять в другом редакторе. Я использовал Notepad++ и очень советую вам – хороший бесплатный редактор.
Второй плагин делает примерно то же, что и третий, только третий выводит график зависимости Y от времени, а второй плагин просто будет проигрывать все действия пользователя после создания сервера. То есть будет видно, как, с какими временными интервалами и в какой последовательности юзер ставил точки. Вот такая вот будет помесь видеопроигрывателя, клиента и третьего плагина.
Запустим Borland C++ builder с правами администратора (если вы на Vista или Windows 7).
Увидите перед собой кучу окошек – в то время, видно, было модно использовать кучу окошек в одном приложении. Откройте Project Manager:
Удалите автоматически созданный проект.
Создайте новый проект.
В выборе типа проекта перейдите на вкладку ActiveX и выберете ActiveX Library.
Добавьте в проект новую форму.
Сохраните всё (Shift+Ctrl+S) или так:
Заведите на жестком диске отдельную папку для этого проекта и последовательно сохраните туда все предложенные файлы. Файл .tlb сохраните как Plugin2.tlb. Форму (по умолчанию Unit1.cpp) сохраните как MainUnit.cpp. Проект (Project1.bpr) сохраните как Plugin2.bpr.
Каркас для проекта готов.