Приложения
Приложение А. Функции, константы и структуры RDS
А.1. Типы параметров
А.1.5. Изменения в программном интерфейсе в версии 2.0
Основной целью разработки второй версии RDS было добавление поддержки текстовых строк Unicode и платформы Windows 64. Принципиально новые возможности в новой версии отсутствуют.
Главные отличия в программном интерфейсе версии 2.0 от версии 1.x связаны изменениями в обработке строк (переход на кодировки UTF8 и UTF16) и с бОльшим размером указателей в Windows 64 (8 байтов вместо 4-х байтов в Windows 32). В связи с этим изменились описания в файлах «RdsDef.h» и «RdsFunc.h», из-за чего старые модели могут не компилироваться без доработки. В большинстве случаев доработка моделей будут касаться заменой #define-описаний смещений переменных, которые можно запросить у RDS в окне редактора переменных.
Ниже приведен список изменений в программном интерфейсе, которые следует учитывать разработчикам моделей и модулей автокомпиляции.
- Все строки char* (они же LPSTR и RDSSTR) теперь считаются кодированными в UTF8. В версиях 1.x они считались кодированными в CP1251.
- В функции rdsProcessText варианты RDS_PT_RDSRUSENCODE и RDS_PT_RDSRUSDECODE больше не поддерживаются. Они использовались только в экспериментальном управлении RDS через web-сервер и текстовые файлы, и дальнейшее развитие этого направление не планируется.
- Типы RDS_NETSTATION и RDS_NETBLOCK теперь занимают не четыре байта (в версии 1.x они были эквивалентны указателю LPVOID), а восемь байтов (LARGE_INTEGER из Windows API). Это изменение не потребует переделок моделей блоков, работающих с сетью.
- Во всех служебных структурах RDS_* поле, содержащее тип переменной блока, теперь имеет тип int (4 байта) вместо char (1 байт) для единообразия.
- В некоторых служебных структурах RDS_* изменен порядок полей, во всех удалены служебные выравнивающие поля. Выравнивание теперь делается использованием для каждого поля анонимного объединения (union), куда вместе с самим полем включено дополнительное поле максимального для платформы размера (64 бита).
- Во всех служебных структурах все строковые поля теперь существуют в двух вариантах: имя_поляA для строк в UTF8 и имя_поляW для строк в UTF16. Если структура заполняется на стороне RDS, всегда заполняются оба поля. Если структура заполняется в модели блока, то поле, значение которого будет использовать вызванная сервисная функция RDS, зависит от версии (суффикса) этой функции – сервисные функции с суффиксом A или W читают из структур поля с тем же суффиксом. Обращение в модели блока к полю без суффикса перенаправляется на одно из двух полей с суффиксами в зависимости от макроопределения, которое можно ввести перед включением «RdsDef.h» (см. приложение А.1.3).
- В структуру данных модуля автокомпиляции (RDS_COMPMODULEDATA) добавлено поле, указывающее на предлагаемое имя файла для хранения параметров модуля с полным путем к нему. Это имя гарантированно не будет совпадать ни с одним другим именем файла в RDS.
- Упразднен служебный файл «RdsFunc_.h». Все описания, необходимые для доступа к сервисным функциям RDS, перенесены в основной файл «RdsFunc.h».
- Упразднен файл «RdsComp.h». Все описания, необходимые для создания модулей автокомпиляции, перенесены в «RdsDef.h». «RdsComp.h» оставлен пустым для совместимости с старыми текстами программ моделей.
- Из-за бОльшего размера указателя в Windows 64 увеличен размер, занимаемый структурами, массивами/матрицами, строками и переменными произвольного типа в дереве переменных. В программах моделей блоков необходимо заменить генерируемые RDS #define-описания для доступа к переменным и полям структур. Собственно работа с переменными в моделях не меняется, достаточно заменить описания.
- В структуре RDS_BLOCKDATA поле VarData переименовано в VarTreeData, чтобы модели со старыми #define-описаниями для переменых (см. предыдущий пункт) давали ошибки при компиляции. Если у блока в дереве переменных есть структуры, строки, массивы или переменные произвольного типа, то запуск его модели, скомпилированной со старыми описаниями, может привести к критическим ошибкам. Поэтому лучше, чтобы модель не могла успешно компилироваться до исправления описаний. Имя VarData оставлено как возможный псевдоним для VarTreeData. Этот псевдоним включается описанием константы RDS_VARDATAALIAS (достаточно наличия такого описания без значения перед включением «RdsDef.h»), но это уже будет осознанным выбором программиста.
- В генерируемых #define-описаниях для переменных теперь указываются не числовые константы смещений, а конструкции вида «2*RDS_VSZ_S+RDS_VSZ_D+…», где RDS_VSZ_S, RDS_VSZ_D и т.п. – константы, описанные в «RdsDef.h». Такая конструкция останется правильной при возможном изменении размеров переменных в будущем.
- Добавлены функции rdsUTF16toUTF8 и rdsUTF8toUTF16 для перекодировки строк из UTF16 в UTF8 и обратно.
- Из «RdsDef.h» убраны описания для модулей преобразования BMP (возможность записи PNG теперь встроена непосредственно в RDS). Сервисные функции, связанные с этими модулями, больше не экспортированы из «Rds.exe»/«Rds64.exe».
См. также
Изменения в версии 2.0 (в описании пользователя), выравнивание полей структур, строки в структурах, строки в функциях.