1C Native API Extension using FreePascal/Lazarus.
Пример Native API расширения для 1С на FreePascal/Lazarus.
Проект для Lazarus IDE (версии >= 1.4.4).
Реализовано три примера:
-
Полный аналог стандартного примера от 1С для C++. Описание методов и свойств расширения осуществляется вручную. (класс TAddInExample в example.pas, регистрация класса в AddInNative.lpr).
-
Реализация стандартного примера от 1С для C++ с использованием более удобного способа описания методов и свойств при регистрации класса (класс TAddInEasyExample в easyexample.pas, регистрация класса в AddInNative.lpr).
-
Попытка добавления возможности использования GUI в расширениях (класс TFormController в guiexample.pas, регистрация класса в AddInNative.lpr). Поскольку LCL написан из расчета работы в основном потоке приложения, пришлось пойти на ряд уступок и упрощений. Как минимум, на данный момент я сходу не нашел возможности усыпить основной цикл обработки сообщений в GUI-потоке при отсутствии необходимости его работы, поэтому просто добавил Sleep :) Из-за этого GUI-поток постоянно использует 15% процессора. Пока нет времени ковырять эту возможность, т.к. мне нужен был только Proof Of Concept самой возможности использования GUI.
Реализовано прозрачное преобразование типов 1С в тип Variant FreePascal.
Для разработки своего расширения необходимо реализовать наследника класса TAddIn из v8addin.pas, и зарегистрировать его в основной секции проекта в файле AddInNative.lpr. Файлы easyexample.pas, example.pas, exampleform.lfm, exampleform.pas и guiexample.pas содержат примеры использования и могут быть удалены при разработке своего расширения. Подключение к 1С скомпилированной библиотеки осуществляется стандартным способом.
Список файлов (части v8addin.pas для удобства вынесены в отдельные включаемые файлы *.inc):
Файл | Описание |
---|---|
AddInNative.lpi | Настройки проекта |
AddInNative.lpr | Основной файл проекта. Тут необходимо зарегистрировать реализованные классы расширений |
addindefbase.inc | Реализация AddInDefBase.h |
binarydata.inc | Работа с двоичными данными (изображениями) 1С |
bindings.inc | Трансляция вызовов методов C++ классов в вызовы методов классов FreePascal |
componentbase.inc | Реализация ComponentBase.h |
easyexample.pas | Пример расширения с упрощенной регистрацией методов и свойств класса |
example.pas | Пример расширения с ручной регистрацией методов и свойств класса (как в примере на C++) |
exampleform.lfm | Данные формы для примера использования GUI |
exampleform.pas | Модуль формы для примера использования GUI |
factory.inc | Фабрика классов (эмуляция классов и объектов C++, трансляция вызовов, создание/уничтожение объектов и т.п.) |
guiexample.pas | Пример расширения с использованием GUI |
imemorymanager.inc | Реализация IMemoryManager.h |
init.inc | Инициализация и очистка памяти для эмуляции классов C++ |
strings.inc | Работа со строками |
types.inc | Реализация types.h |
v8addin.pas | Базовый класс для реализации расширения (TAddIn) |
v8addingui.pas | Реализация отдельного потока для работы с GUI |
variants.inc | Преобразование типов 1С в тип Variant FreePascal |
NativeAPI.epf | Пример внешней обработки для использования компоненты |