12 апреля 2014 г.

Подключаемые модули в новых версиях ЛОЦМАН Клиент

Для разработчиков плагинов в новых версиях 13 и 14 комплекса произошли заметные изменения (под версиями 13 и 14 здесь подразумевается «Комплекс решений АСКОН 2013» и «Комплекс решений АСКОН 2014»).

Положительная сторона изменений в том, что API плагинов теперь документирован (см. LoodsmanClientApi.chm) и предоставляет разработчику больше возможностей. Из недостатков стоит отметить несовместимость API со старыми версиями плагинов, и даже между 13 и 14 версиями. И документации мало, и местами она не соответствует реальному положению дел. И баги в IDataSet... Но не будем о грустном.

Итак, основные изменения, которые удалось увидеть на сегодняшний день:
  1. Объект, реализующий IDataSet, был вынесен в отдельную библиотеку DataProvider.dll. И это было бы незначительное изменение, не затрагивающее плагины, если бы не изменился идентификатор (GUID) интерфейса IDataSet. Дело осложняется тем, что в Delphi вызов QueryInterface может присутствовать неявно при приведении типов.
  2. В версии 14.0.0.905 у интерфейса IDataSet не работают методы IDispatch, такие как GetIDsOfNames и Invoke. В службе поддержки обещали исправить.
  3. Объекты, реализующие IPDMObject, IWFObject и подобные переехали в PDMObjects.dll. В версии 14 в иерархии интерфейсов этих объектов появился новый предок IProtectedPDMData, в результате чего все эти объекты несовместимы между 13 и 14 версиями.
  4. У IPluginCall.GetDataSet изменился тип возвращаемого значения с IDataSet на IDispatch. Это изменение неудобно тем, что в старых плагинах потребуется исправить все вызовы GetDataSet.
  5. Пункты меню плагина теперь неактивны, если в клиенте выбрано что-нибудь, отличное от объекта или документа, или если не выбрано ничего. В документации сказано, что это сделано «для предотвращения ошибок, которые могут возникнуть в уже разработанных модулях расширения». Если плагину нужно работать с бизнес-процессами или заданиями, или если нужно, чтобы пункты меню были доступны, когда в клиенте ничего не выбрано, DLL плагина должна экспортировать функцию GetPluginInfo (есть в шаблоне подключаемого модуля).
  6. По умолчанию теперь все пункты меню подключаемых модулей помещаются в отдельное меню «Дополнения». При необходимости их можно перенести в другое место меню, вынести на панель инструментов или добавить в контекстное меню.

Для перевода плагинов на новый API от разработчика потребуется использовать новый модуль Loodsman_TLB.pas (и связанные с ним) от нужной версии комплекса.

В приведенных ниже модулях Loodsman_TLB.pas тип возвращаемого значения IPluginCall.GetDataSet исправлен на IDataSet, и в версиях 13 и 14 добавлен тип IDataSet = DataProvider_TLB.IDataSet. В результате старые плагины можно собирать с новыми заголовочными файлами без изменения кода.

Теперь есть две версии шаблона подключаемого модуля: полностью самостоятельный проект PluginSample2 и зависящий от общей инфраструктуры PluginSample.

Если вам не нужно отдельное подключение к серверу приложений, или вы используете старую версию Delphi (до Delphi 2010), то лучше использовать независимый PluginSample2. В настройках проекта необходимо будет указать путь к файлам нужной версии API в SearchPath. Для версий 8.5−10 это APIv10, для версии 11, 13 и 14 это APIv11, APIv13 и APIv14 соответственно.



Шаблон подключаемого модуля PluginSample может использовать самостоятельное подключение к серверу приложений IRemoteConnection и собственную реализацию IDataSet. По умолчанию плагин собирается для API версии 14, но можно собрать со старой версией IDataSet (директива UseV11DataSet) или с объектами IPDMObject, IWFObject версии 13 (директива UseV13PDMData).



Для новых версий комплекса доработан код из статьи Подключение к серверу приложений. Наборы данных. Реализация теперь поддерживает интерфейсы IDataSet старых и новых версий.

Весь код, описанный в статье, находится на GitHub:
github.com/achechulin/loodsman.

Текущую версию кода можно скачать без клиента Git или SVN, нажав кнопку «Download ZIP» в правой части страницы репозитория.

Комментариев нет:

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