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