Вверх ↑
Ответов: 9906
Рейтинг: 351
#1: 2005-06-29 04:23:39 ЛС | профиль | цитата
Так вот чего я знаю про это на сегодняшний день:

1) Среда уже распознает наличие CodeGen.dll в папке соответствующего проекта, и если нашла таковую - готова радостно перепоручить кодогенерацию этой dll-ке

2) Результат работы (несколько StrList-ов) среда далее передаст одной из dll-к типа make_XXX. Так называемые генераторы проекта.
Исходники на эти dll-ки (кроме make_exe) лежат в папке %HiAsm%\plug, и, если ознакомиться с ними, приходит понимание как сделать свой проект (например, тот же отсутствующий make_exe, или генератор кодогенератора из схемы HiAsm)

3) CodeGen.dll экспортирует один метод:
function CreateCode(SDK:cardinal; cgt:PCodeGenTools):pointer; cdecl;[/code]
А возвращаемый поинтер - это такая штука:
type
  TCGrec = record
    MainForm:string;
    Vars,Units,IBody,Dead:PStrList;
  end;
  PCGrec = ^TCGrec;
StrList-ы - это заполненые заготовки кода: поля определения переменных (типа Button_4B77771)
, необходимые для включения юниты, коды инициализации (типа Button_4B77771.Caption:='Нажимай!'; ), строки для включения в деструктор - соответственно. В общем, если присмотреться к исходникам на dll-ки проектов - эти StrList-ы легко идентифицируемы. 4) Ну и самое непонятное - это предоставляемый средой список указателей на методы для использования:
 TCodeGenTools = object
   //~~~~~~~~~~~~~~~~~~~~~~~~ SDK ~~~~~~~~~~~~~~~~~~~~~~~~~~
   sdkGetCount:function (SDK:cardinal):integer;
   //возвращает количество элементов в схеме
   sdkGetElement:function (SDK:cardinal; Index:integer ):cardinal;
   //возвращает идент элемента по его Z-координате(индексу)
   sdkGetElementName:function (SDK:cardinal; Name:PChar ):cardinal;
   //возвращает идент элемента по имени его класса
   //~~~~~~~~~~~~~~~~~~~~~~~~ Element ~~~~~~~~~~~~~~~~~~~~~~~~~~
   elGetFlag:function (e:cardinal):cardinal;
   //возвращает "хитрые" особенности элемента по его иденту
   elGetPropCount:function (e:cardinal):cardinal;
   //возвращает кол-во св-в элемента
   elGetProperty:function (e:cardinal; Index:integer):PParamRec;
   //возвращает целую структуру для конкретного св-ва с порядковым номером из INI
   elIsDefProp:function (e:cardinal; Index:integer):boolean;
   //возвращает True, если значение св-ва совпадает с заданным в INI файле, иначе False
   elSetCodeName:function (e:cardinal; Name:pchar):cardinal;
   //даем элементу свое любимое(уникальное) имя
   elGetCodeName:function (e:cardinal):PChar;
   //и получаем его обратно (если забыли)
   elGetClassName:function (e:cardinal):PChar;
   //а вот имя класса не мы давали - можем только узнать
   elGetInfSub:function (e:cardinal):PChar;
   //просто содержимое поля Sub из INI-файла элемента
   elGetPtCount:function (e:cardinal):cardinal;
   //получаем количество точек у элемента
   elGetPt:function (e:cardinal; i:integer):cardinal;
   //получаем идент точки по её индексу
   elGetPtName:function (e:cardinal; Name:PChar):cardinal;
   //получаем идент точки по её имени
   elGetClassIndex:function (e:cardinal):byte;
   //получаем подкласс элемента(константы типа CI_ХХХ)
   elGetSDK:function (e:cardinal):cardinal;
   //получаем идент внутренней схемы для контейнеров
   elLinkIs:function (e:cardinal):boolean;
   //возвращает True, если данный элемент является ссылкой либо на него ссылаются
   elLinkMain:function (e:cardinal):cardinal;
   //возвращает идент главного элемента(тот, на который ссылаются другие)
   //~~~~~~~~~~~~~~~~~~~~~~~~ Point ~~~~~~~~~~~~~~~~~~~~~~~~~~
   ptGetLinkPoint:function (p:cardinal):cardinal;
   //возвращает идент точки, с которой соеденена данная
   ptGetRLinkPoint:function (p:cardinal):cardinal;
   //возвращает идент точки, с которой соеденена данная без учета точек разрыва и хабов
   ptGetType:function (p:cardinal):cardinal;
   //возвращает тип точек(константы pt_XXX)
   ptGetName:function (p:cardinal):pchar;
   //возвращает имя точки
   ptGetParent:function (p:cardinal):cardinal;
   //возвращает идент элемента, которому принадлежит точка
   ptGetIndex:function (p:cardinal):cardinal;
   //возвращает относительный индекс точки по пренадлежности к одной из 4х групп
   pt_dpeGetName:function (p:cardinal):PChar;
   //возвращает базовую часть имени динамических точек(для CI_DPElement)
   //~~~~~~~~~~~~~~~~~~~~~~~~ Property ~~~~~~~~~~~~~~~~~~~~~~~~~~
   propArrayCount:function (PRec:PParamRec):integer;
   //возвращает количество элементов в массиве
   propArrayGetItem:function (PRec:PParamRec; Index:integer):TParamRec;
   //возвращает элемент массива по его индексу
   //~~~~~~~~~~~~~~~~~~~~~~~~ Res ~~~~~~~~~~~~~~~~~~~~~~~~~~
   resAddFile:function (Name:pchar):cardinal;
   //добавляет имя файла в общий список временных файлов для последующего удаления
   resAddIcon:function (P:PParamRec):PChar;
   //добавляет иконку в ресурсы и в список временных файлов
   resAddStr:function (P:PChar):PChar;
   //добавляет строку в ресурсы и в список временных файлов
   resAddStream:function (P:PParamRec):PChar;
   //добавляет поток в ресурсы и в список временных файлов
   resAddWave:function (P:PParamRec):PChar;
   //добавляет звук в ресурсы и в список временных файлов
   resAddBitmap:function (P:PParamRec):PChar;
   //добавляет картинку в ресурсы и в список временных файлов
   //~~~~~~~~~~~~~~~~~~~~~~~~ Other ~~~~~~~~~~~~~~~~~~~~~~~~~~
   _Debug:function (Text:PChar; Color:cardinal):cardinal;
   //выводит строку Text в окно Отладка цветом Color
   GetCodePatch:function ():PChar;
   //возвращает путь к папке code текущего пакета
   ParamToText:function (p:PParamRec):PChar;
   //переводит параметр в текст(в данной версии только для типа data_script)
 end;
 PCodeGenTools = ^TCodeGenTools;
Про них я кое чего знаю, кое что знаю но не точно, а кое чего не знаю... Поэтому развернутого описания не получится. Хотя знаю точно, что в 148-й этот список уже немного другой (расширен несколько) Ну вот и начало обсуждения может начаться с просьбы к [b]Dilma[/b] обновить этот список и дополнить(исправить :)) справа короткими комментариями. Как результат, существует гипотеза, что продвинутый пользователь, обладая более подробными знаниями о вышеописанном, в состоянии и сам написать dll-ку, генерерующую те несложные коды, которые мы видим после Ctrl+D :lol: Соответственно и предложение: давайте приобретать эти знания, расспрашивая [b]Dilma[/b] Вот пусть он нам должит о состоянии дел на этом фронте. :) Ну а мы ему, в ответ, сразу же расскажем, что он делает неправильно :D
карма: 9

0