Введение
Создание экземпляра модуля
Описание интерфейсов
Файл описания внешнего модуля
Подключение внешнего модуля
Заключение
Начиная с версии 4.3 в ГИС ИнГЕО добавлена возможность создания внешних модулей расширения, реализованных в виде COM-интерфейсов.
Внешний модуль реализуется в виде интерфейса стандарта COM, но без необходимости регистрации COM-класса. Экземпляр модуля расширения может создаваться как обычным для COM образом, так и упрощенным - при помощи специальной функции, экспортируемой из DLL-библиотеки.
Со стороны ИнГЕО модулю расширения передается другой интерфейс, предназначенный для доступа к объектам ИнГЕО.
Помимо файла DLL-библиотеки, в каталоге установки ИнГЕО необходимо размещать специальный вспомогательный файл с описанием внешнего модуля.
Экземпляр модуля может быть создан как обычным для COM способом, так и упрощенным.
При обычном способе необходимо создать COM-класс, реализующий интерфейс IInPlugin.
При упрощенном способе необходимо создать DLL-библиотеку, которая экспортирует функцию создания экземпляра модуля расширения с именем "CreateInPlugin". Ниже приведено описание функции на Delphi:
function CreateInPlugin(const aPluginName: WideString): IInPlugin; stdcall;
Параметр | Описание |
aPluginName | Название модуля расширения, экземпляр которого необходимо создать. Может быть использовано для библиотек, реализующих несколько модулей расширений. |
Как было сказано выше, функция CreateInPlugin должна создать экземпляр модуля и вернуть его в виде интерфейса IInPlugin.
Описание IInPlugin:
IInPlugin = interface(IUnknown)
['{418B6595-915E-4E2B-A388-7146FDC3D73C}']
procedure Start(const aSite: IInPluginSite); safecall;
procedure Stop; safecall;
procedure ExecuteAction(const anActionName: WideString); safecall;
end;
Метод Start вызывается в момент запуска модуля. Через параметр aSite со стороны ИнГЕО внешнему модулю передается интерфейс , предназначенный для доступа к объектам ИнГЕО. Внешний модуль может запомнить ссылку на этот интерфейс, и удерживать ее до вызова метода Stop.
Метод Stop вызывается в момент остановки модуля. В реализации этого метода внешний модуль обязан освободить все ссылки на объекты ИнГЕО, которые он захватил во время работы.
Метод ExecuteAction является обработчиком команд, связанных с внешним модулем.
Со своей стороны ИнГЕО передает внешнему модулю интерфейс IInPluginSite:
IInPluginSite = interface(IDispatch)
['{47C4FA1A-A346-4E6D-96E2-1B22C7533C89}']
function Get_ContextCard: IInContextCard; safecall;
function Get_Application: IIngeoApplication; safecall;
function Get_Module: IInModule; safecall;
function FindScopeObject(const aName: WideString): IDispatch; safecall;
end;
Указанный интерфейс содержит ряд методов для доступа к объектам ИнГЕО:
Метод | Описание |
Get_ContextCard | Возвращает интерфейс на объект, который является карточкой контекста для данного внешнего модуля. Карточка контекста используется при внедрении в интерфейс пользователя ИнГЕО (например, при добавлении пунктов меню). После остановки модуля, все элементы пользователя ИнГЕО, созданные с использованием этой карточки контекста, будут уничтожены. |
Get_Application |
Возвращает интерфейс на главный объект ИнГЕО. |
Get_Module | Возвращает интерфейс IInModule, представляющий собой программный модуль ИнГЕО, в рамках которого запущен внешний модуль. |
FindScopeObject | Возвращает интерфейс на именованные объекты, доступные в среде выполнения внешнего модулю. Всегда доступен объект с именем "Application". В программной среде макета печати дополнительно доступен объект "LayoutWindow" (IInLayoutWindow). |
Файл описания внешнего модуля должен лежать в каталоге установке ИнГЕО или в
любом из его подкаталогов любого уровня вложенности. Файл должен содержать
текст в формате XML и иметь расширение "inm". Структура файла описывается
в нижеследующей таблице. При описании XML-структуры используется следующая
нотация:
название - название элемента;
@название - название атрибута;
text() - внутренний текст элемента.
Элемент/атрибут | Описание |
modules | Корневой элемент. |
module | Элемент описания отдельного модуля. |
@name | название модуля (должно удовлетворять правилам именования идентификаторов в языках программирования). |
@caption | Заголовок модуля. Будет отображаться в списке модулей. |
@description | Дополнительное описание модуля. Небольшой текст с информацией о модуле. |
@category | Категория, к которой относится модуль. Используется в диалоге выбора модулей, в котором они группируются по категориям. Например "Импорт/экспорт". Названия категорий не чувствительны к регистру букв. Категории представляют собой иерархическую структуру. Для определения местоположения модуля в этой структуре в названии категории следует использовать символ "\" для разделения подкатегорий. |
dependency | Зависимости от других модулей. Список зависимых модулей указывается тогда, когда необходимо, что бы до запуска данного модуля некоторые другие модули уже были запущены. |
text() | Название модуля, от запуска которых зависит данный модуль. |
@plugin-source |
Источник модуля. Может быть названием COM-класса (например "Project1.Object1"), идентификатором COM-класса (например "{3605F781-82BF-11D3-9665-000021C6D845}") или именем файла DLL, содержащего функцию CreateInPlugin.
Имя файла библиотеки может содержать две специальных заменяемых вставки: |
@plugin-name | Название внешнего модуля, которое будет передаваться в процедуру "CreateInPlugin", экспортируемую из DLL-библиотеки. Данный атрибут используется только в том случае, если атрибут @plugin-source содержит имя DLL-файла. |
Для того, чтобы модуль появился в списке модулей ИнГЕО, достаточно просто разместить файлы DLL и INM в каталог установки ИнГЕО или любом из его подкаталогов любой вложенности. Для запуска модуля в ИнГЕО необходимо воспользоваться командой "ИнГЕО..." из меню "Файл -> Программные модули" или нажать клавишу "F7".
В заключение хотелось бы отметить следующее: файл INM является обычным программным модулем ИнГЕО. Если он будет содержать описание команд, меню, скриптов, то последние будут загружены и запущены после запуска внешнего модуля.
Систему внешних модулей можно рассматривать как небольшое развитие системы
программных модулей ИнГЕО. Если рассматривать вопрос с такой точки зрения, то
новшество свелось к тому, что у программного модуля появилось два свойства:
"Источник внешнего модуля" и "Название внешнего модуля".
Если эти свойства заданы, то в момент запуска программного модуля будет также запускаться внешний модуль, реализация которого содержится в указанной DLL.
Порядок очередности запуска следующий: сначала стартует программный модуль, затем скрипты. Порядок остановки - обратный.
Если объект внешнего модуля помимо интерфейса IInPlugin реализует интерфейс IDispatch, тогда из скриптов программного модуля будет возможен доступ к объекту внешнего модуля посредством встроенной переменной с именем "Plugin".