4. Предлагается возможность подключения пользовательских режимов, т.е. режимов, созданных самим пользователем-разработчиком (ИРБИС64). Это означает, что пользователь может "повесить" собственные режимы обработки (как пакетные, так и интерактивные) в главном меню и на панели инструментов. Предполагается, что режим пользователя представляет собой функцию DLL (как в &unifor('+8...) – см. ниже) Режимы пользователя описываются через INI-файл (irbisc.ini секция [USERMODE]) по следующей схеме - каждый внешний режим пользователя описывается следующими параметрами: - UMDLLn - имя DLL (в случае нестандартного вызова функций перед именем DLL следует поставить символ *); - UMFUNCTIONn - имя функции DLL, реализующей данный режим; - UMPFTn - имя формата, в соответствии с которым осуществляется передача входных данных в функцию (формат применяется к текущей записи); - UMNAMEn - название режима на естественном языке (для главного меню и подсказки); - UMGROUPn - порядковый номер группы режимов в главном меню; - UMICONn – имя иконки для отображения данного режима на панели инструментов (иконка включается в DLL в качестве ресурса типа ICON размером 16х16 ). n – порядковый номер режим в списке (начиная с 0). Общее количество режимов пользователя указывается в параметре UMNUMB. Регламентируется формат данных, возвращаемых функцией режима. В общем случае это список строк (т.е. данных, разделенных символами $0D0A): Конкретное содержание возвращаемых данных определяется кодом возврата функции режима (целое число). В настоящей версии предлагаются следующие коды возврата: - отрицательное число – ненормальное завершение режима, возвращаемые данные не учитываются: - 0 – нормальное завершение, никакие данные не возвращаются; - 1 – выполнена корректировка текущей записи, возвращаемые данные представляют собой текущую запись (полностью) в соответствии с форматом &unifor(‘+0’), а именно: 0 #<статус записи> 0#<версия записи> <метка поля 1>#<значение поля 1> <метка поля 2>#<значение поля 2> …………………… <метка поля N>#<значение поля N> При этом данные , <статус записи> и <версия записи> при возврате не учитываются. --------------------- Язык форматирования 1. Предлагается новый форматный выход (UNIFOR), который позволяет вызывать функции из внешних DLL, - т.е. предлагается возможность создания СОБСТВЕННЫХ ФОРМАТНЫХ ВЫХОДОВ. Структура нового UNIFOR: &unifor('+8<имя_DLL>,<имя_функции>,<передаваемые_данные>') Пример: ...&unifor('+8test_dll,test_function1,',v200^a)... - (в вызываемую функцию передается заглавие) ..(&unifor('+8test_dll,test_function2,',v910)).... - (передаются повторения 910 поля) ..(&unifor('+8test_dll,test_function2,',&unifor('+0')))....(передается вся текущая запись) Внешние функции должны ОБЯЗАТЕЛЬНО иметь следующую структуру: (Pascal) test_function1(buf1,buf2: Pchar; bufsize: integer): integer; (C) int test_function1(char *buf1, char *buf2, int bufsize) где: buf1 - передаваемые данные (входные) buf2 - возвращаемые данные (выходные) bufsize - размер выходного буфера (buf2) (в ИРБИС64 данные передаются и возвращаются в UTF8) Возврат функции: =0 - нормальное завершение; <>0 – ненормальное. В случае нестандартного вызова функций из DLL (по Pascal-правилам) надо указывать символ * перед именем DLL: &unifor('+8*<имя_DLL>,<имя_функции>,.... Следует помнить, что имя функции в вызове надо указывать строго в соответствии с тем, как она экспортирована из DLL (т.е. большие и маленькие буквы различаются)