Вверх ↑
Этот топик читают: Гость
Ответов: 1841
Рейтинг: 369
#211: 2014-12-10 16:08:15 ЛС | профиль | цитата
Ну вот, первый этап выполнен
Список задач составлен, форматирование произведено, осталось выполнить TODO и можно дальше ехать.

p.s. Ну и намучился я со структурой TCodeGenTools Каша ещё та...
карма: 1
1
Голосовали:LastLeader
Ответов: 1841
Рейтинг: 369
#212: 2014-12-14 10:24:52 ЛС | профиль | цитата
Потихонечку уже начинает получаться
Например, схема: "HiAsm_AltBuildElementsdelphiExampleOpenGLHiAsm3D.sha"
hiasm3d.7z
Тут мы выводим значения переменных элементов, с учётом вложенности контейнеров.


Или, схема: "HiAsm_AltBuildElementsCNETExamplegraphicsArcanoid.sha"
arcanoid.7z

Т.е. имеем поддержку контейнеров и полиморфных контейнеров любой (относительно ) вложенности
Формат сохранения будет скорее всего в json (текстовый и бинарный формат).
карма: 1
1
файлы: 2arcanoid.7z [2KB] [315], hiasm3d.7z [1.8KB] [335]
Голосовали:LastLeader
Главный модератор
Ответов: 2997
Рейтинг: 395
#213: 2015-06-07 09:34:44 ЛС | профиль | цитата
CriDos писал(а):
намучился я со структурой TCodeGenTools

CriDos, Удалось ли Вам «достучаться» до «дельфячего» кодогенератора из «плюсов»?
Если да, то не поделитесь ли вашим кодом обращения к функциям кодогенератора?
карма: 6
Дорогу осилит идущий. Install/Update HiAsm.NET
0
Ответов: 1841
Рейтинг: 369
#214: 2015-06-08 01:33:37 ЛС | профиль | цитата
Nic писал(а):
«дельфячего» кодогенератора из «плюсов»?

Ещё не пробовал стучать в него.
Ибо, сначала нужно полностью воспроизвести механизм взаимодействия кодогенератора и среды в прокси-интерфейсе (частично реализовано), и только потом, подключать к прокси-интерфейсу кодогенераторы.
Без этого промежуточного интерфейса, нет смысла работать напрямую с кодогенераторами, т.к. их функционал тесно завязан на коллбеках среды

А само подключение кодогенераторов, не должно быть проблемой в теории
------------ Дoбавленo в 01.33:
Если у Вас проблема именно в соглашениях вызовов, то вот небольшой пример (gcc_4.9.2, c++11) проверки поддержки версии среды кодогенератором, путём вызова функции CheckVersionProc delphi кодогенератора: http://pastebin.com/k0P2VMM0
карма: 1
0
Главный модератор
Ответов: 2997
Рейтинг: 395
#215: 2015-06-08 09:20:51 ЛС | профиль | цитата
CriDos писал(а):
...проблема именно в соглашениях вызовов...

Установить проблему пока не удаётся. Рабочая гипотеза - неодинаковая передача параметров строковых данных через стек, требующая дополнительных «приседаний» как раз в callback'ax.
карма: 6
Дорогу осилит идущий. Install/Update HiAsm.NET
0
Ответов: 1841
Рейтинг: 369
#216: 2015-06-08 13:18:13 ЛС | профиль | цитата
Ну, если имеется ввиду функция:
#pas
function buildProcessProc(var params:TBuildProcessRec):integer; cdecl;
то здесь, соглашение уже немного другое будет (extern "C" __declspec(dllimport) заместо FASTCALL).
Дале, у нас передаётся ссылка (жесткий указатель) на структуру:
#pas
TBuildProcessRec = record
cgt:PCodeGenTools;
sdk:cardinal;
result:pointer;
end;
аналог из плюсового загаловка:
#cpp
typedef struct {
PCodeGenTools cgt;
id_sdk sdk;
void *result;
} TBuildProcessRec;
Самым сложным, остаётся, реализация методов структуры TCodeGenTools
Точнее, нужно заранее в памяти держать всю необходимую кодогенератору информацию о схеме и предоставлять к ней доступ посредству этих вот методов.
С получением аргументов данных в методах, тоже не должно быть проблем, т.к. все необходимые сложные типы данных, описаны Автором в плюсовом заголовке CGTShare.h (если Автор корректно их описал относительно дельфи реализации), иначе нужно смотреть в реализацию cgt.
В крайнем случае, можно попробовать собрать кодогенератор с отладочной информацией, добавив к аргументам сборки параметры "-V -VN", и попробовать отлаживать всё это дело в gdb
Если он понимает дельфячий формат отладочной инфы.
------------ Дoбавленo в 13.06:
CriDos писал(а):
extern "C" __declspec(dllimport) заместо FASTCALL

Хотя, нотацию extern "C" __declspec(dllimport) вообще можно опустить, т.к. соглашение по умолчанию используемое в плюсам соответствует cdecl.
------------ Дoбавленo в 13.18:
Провёл небольшой эксперимент.
В кодогенераторе добавил пару строк:
#pas
function buildProcessProc(var params:TBuildProcessRec):integer; cdecl;
...
begin
MsgOK(Int2Str(Integer(params.cgt)));
MsgOK(Int2Str(Integer(params.result)));
...
и собрал.
Далее, был переписан немного предыдущий пример на плюсах: http://pastebin.com/BvgJtK82
В результате, после запуска получаем несколько сообщений с выводом "123" и "333" и падение на строке:
#pas
Cgt := params.cgt;
что и не удивительно
Т.е. из этого следует, что параметры передаются корректно.
С этого момента, проблемы могут возникать только из-за несоответствий в структурах данных.
карма: 1
0
Ответов: 316
Рейтинг: 21
#217: 2015-06-08 18:36:39 ЛС | профиль | цитата
Nic, У нас есть постоянно весящий скайп чат, тематика - продвижение хиасма, есть желание подключиться?
Для обмена идеями.
карма: 1

0
Ответов: 1841
Рейтинг: 369
#218: 2015-06-08 18:59:54 ЛС | профиль | цитата
Если что, на основе предыдущих наработок, открыл новый проект HiAsm_ProxyInterface: https://github.com/CriDos/HiAsm_ProxyInterface
В дальнейшем, возможно, будет объединён с проектом HiAsm_Interface.

Библиотека является промежуточным звеном между средой и кодогенератором, которая транслирует все полученные данные из среды в кодогенератор, и наоборот.
Очень удобная штука для изучения кодогенератора или отладки взаимодействия с оным.
На данным момент, полностью работает загрузка, сборка и запуск схемы из среды (HiAsm 4) через промежуточную библиотеку.
карма: 1
0
Главный модератор
Ответов: 2997
Рейтинг: 395
#219: 2015-06-08 21:40:22 ЛС | профиль | цитата
Библиотека является промежуточным звеном между средой и кодогенератором

Попробую посмотреть. Может этого будет достаточно.
------------ Дoбавленo в 21.40:
Nic писал(а):
Попробую посмотреть

С этими вызовами проблем, как мне кажется, нет. Проблемы в обработке вызовов (callback) из «дельфячего» кодогенератора.
карма: 6
Дорогу осилит идущий. Install/Update HiAsm.NET
0
Ответов: 1841
Рейтинг: 369
#220: 2015-06-09 14:43:05 ЛС | профиль | цитата
Nic писал(а):
С этими вызовами проблем, как мне кажется, нет. Проблемы в обработке вызовов (callback) из «дельфячего» кодогенератора.

Сейчас как раз занимаюсь проксированием структуры TCodeGenTools со всеми его методами.
Сегодня-завтра постараюсь закончить.
Посмотрим что получится.
------------ Дoбавленo в 06.53:
Ну вот, все 85 функций структуры TCodeGenTools - "проксированы"
Вот что уже удаётся получить при загрузке, сборке и запуске пустой схемы, Windows пакета:
Массив информации

Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call isReadyForAdd
Result: true
Call CheckVersionProc
Result: 0
Call buildPrepareProc
Result: 0
Call buildProcessProc
Call isDebug
Result: false
Call GetParam
Result: 0
Call sdkGetElementName
Result: 0x0
Call sdkGetElement
Result: 0x2577b50
Call GetParam
Result: 0
Call sdkGetCount
Result: 1
Call sdkGetElement
Result: 0x2577b50
Call elGetFlag
Result: 522
Call sdkGetCount
Result: 1
Call sdkGetElement
Result: 0x2577b50
Call elGetFlag
Result: 522
Call elGetClassName
Result: MainForm
Call elSetCodeName
Result: 0x2577b50
Call elSetData
Call elGetFlag
Result: 522
Call elGetClassName
Result: MainForm
Call elGetClassIndex
Result: 10
Call elGetCodeName
Result: MainForm_2577B50
Call elGetParent
Result: 0x2576570
Call sdkGetParent
Result: 0x0
Call elGetClassName
Result: MainForm
Call elGetFlag
Result: 522
Call elGetClassName
Result: MainForm
Call elGetClassIndex
Result: 10
Call elGetClassIndex
Result: 10
Call elGetClassIndex
Result: 10
Call elGetPropCount
Result: 38
Call elGetProperty
Result: 0x24e7788
Call propGetType
Result: 1
Call elGetProperty
Result: 0x24e779c
Call propGetType
Result: 1
Call elGetProperty
Result: 0x24e77b0
Call propGetType
Result: 1
Call elGetProperty
Result: 0x24e77c4
Call propGetType
Result: 1
Call elGetProperty
Result: 0x24e77d8
Call propGetType
Result: 14
Call elGetProperty
Result: 0x24e77ec
Call propGetType
Result: 8
Call elGetProperty
Result: 0x24e7800
Call propGetType
Result: 15
Call elGetProperty
Result: 0x24e7814
Call propGetType
Result: 14
Call elGetProperty
Result: 0x24e7828
Call propGetType
Result: 14
Call elGetProperty
Result: 0x24e783c
Call propGetType
Result: 14
Call elGetProperty
Result: 0x24e7850
Call propGetType
Result: 14
Call elGetProperty
Result: 0x24e7864
Call propGetType
Result: 14
Call elGetProperty
Result: 0x24e7878
Call propGetType
Result: 1
Call elGetProperty
Result: 0x24e788c
Call propGetType
Result: 4
Call elGetProperty
Result: 0x24e78a0
Call propGetType
Result: 4
Call elGetProperty
Result: 0x24e78b4
Call propGetType
Result: 2
Call elGetProperty
Result: 0x24e78c8
Call propGetType
Result: 2
Call elGetProperty
Result: 0x24e78dc
Call propGetType
Result: 20
Call elIsDefProp
Result: true
Call elGetProperty
Result: 0x24e78f0
Call propGetType
Result: 20
Call elIsDefProp
Result: true
Call elGetProperty
Result: 0x24e7904
Call propGetType
Result: 1
Call elGetProperty
Result: 0x24e7918
Call propGetType
Result: 1
Call elGetProperty
Result: 0x24e792c
Call propGetType
Result: 1
Call elGetProperty
Result: 0x24e7940
Call propGetType
Result: 2
Call elGetProperty
Result: 0x24e7954
Call propGetType
Result: 4
Call elGetProperty
Result: 0x24e7968
Call propGetType
Result: 4
Call elGetProperty
Result: 0x24e797c
Call propGetType
Result: 6
Call elGetProperty
Result: 0x24e7990
Call propGetType
Result: 4
Call elGetProperty
Result: 0x24e79a4
Call propGetType
Result: 14
Call elGetProperty
Result: 0x24e79b8
Call propGetType
Result: 8
Call elGetProperty
Result: 0x24e79cc
Call propGetType
Result: 11
Call elGetProperty
Result: 0x24e79e0
Call propGetType
Result: 2
Call elGetProperty
Result: 0x24e79f4
Call propGetType
Result: 14
Call elGetProperty
Result: 0x24e7a08
Call propGetType
Result: 14
Call elGetProperty
Result: 0x24e7a1c
Call propGetType
Result: 14
Call elGetProperty
Result: 0x24e7a30
Call propGetType
Result: 1
Call elGetProperty
Result: 0x24e7a44
Call propGetType
Result: 1
Call elGetProperty
Result: 0x24e7a58
Call propGetType
Result: 20
Call elIsDefProp
Result: true
Call elGetProperty
Result: 0x24e7a6c
Call propGetType
Result: 20
Call elIsDefProp
Result: true
Call elGetPropCount
Result: 38
Call elGetProperty
Result: 0x24e7788
Call propGetType
Result: 1
Call propToInteger
Result: 0
Call propGetType
Result: 1
Call propGetName
Result: Left
Call elGetProperty
Result: 0x24e779c
Call propGetType
Result: 1
Call propToInteger
Result: 0
Call propGetType
Result: 1
Call propGetName
Result: Top
Call elGetProperty
Result: 0x24e77b0
Call propGetType
Result: 1
Call propToInteger
Result: 400
Call propGetType
Result: 1
Call propGetName
Result: Width
Call elGetProperty
Result: 0x24e77c4
Call propGetType
Result: 1
Call propToInteger
Result: 300
Call propGetType
Result: 1
Call propGetName
Result: Height
Call elGetProperty
Result: 0x24e77d8
Call propGetType
Result: 14
Call propToString
Result: caNone
Call propGetType
Result: 14
Call propGetName
Result: Align
Call elGetProperty
Result: 0x24e77ec
Call propGetType
Result: 8
Call propToInteger
Result: -16777201
Call propGetType
Result: 8
Call propGetName
Result: Color
Call elGetProperty
Result: 0x24e7800
Call propGetType
Result: 15
Call propGetValue
Result: 0x3b4ec50
Call fntName
Result: MS Sans Serif
Call fntSize
Result: 8
Call fntStyle
Result: 0
Call fntColor
Result: 0
Call fntCharSet
Result: 1
Call propGetType
Result: 15
Call propGetName
Result: Font
Call elGetProperty
Result: 0x24e7814
Call propGetType
Result: 14
Call propToString
Result: False
Call propGetType
Result: 14
Call propGetName
Result: ParentFont
Call elGetProperty
Result: 0x24e7828
Call propGetType
Result: 14
Call propToString
Result: True
Call propGetType
Result: 14
Call propGetName
Result: Visible
Call elGetProperty
Result: 0x24e783c
Call propGetType
Result: 14
Call propToString
Result: True
Call propGetType
Result: 14
Call propGetName
Result: Enabled
Call elGetProperty
Result: 0x24e7850
Call propGetType
Result: 14
Call propToString
Result: crDefault
Call propGetType
Result: 14
Call propGetName
Result: Cursor
Call elGetProperty
Result: 0x24e7864
Call propGetType
Result: 14
Call propToString
Result: True
Call propGetType
Result: 14
Call propGetName
Result: KeyPreview
Call elGetProperty
Result: 0x24e7878
Call propGetType
Result: 1
Call propToInteger
Result: 0
Call propGetType
Result: 1
Call propGetName
Result: TabOrder
Call elGetProperty
Result: 0x24e788c
Call propGetType
Result: 4
Call propToByte
Result: 1
Call propGetType
Result: 4
Call propGetName
Result: Ctl3D
Call elGetProperty
Result: 0x24e78a0
Call propGetType
Result: 4
Call propToByte
Result: 0
Call propGetType
Result: 4
Call propGetName
Result: WinStyle
Call elGetProperty
Result: 0x24e78b4
Call propGetType
Result: 2
Call propToString
Result:
Call propGetType
Result: 2
Call propIsTranslate
Result: 0
Call propGetName
Result: Name
Call elGetProperty
Result: 0x24e78c8
Call propGetType
Result: 2
Call propToString
Result:
Call propGetType
Result: 2
Call propIsTranslate
Result: 0
Call propGetName
Result: Hint
Call elGetProperty
Result: 0x24e78dc
Call propGetType
Result: 20
Call elGetProperty
Result: 0x24e78f0
Call propGetType
Result: 20
Call elGetProperty
Result: 0x24e7904
Call propGetType
Result: 1
Call propToInteger
Result: 0
Call propGetType
Result: 1
Call propGetName
Result: WidthScale
Call elGetProperty
Result: 0x24e7918
Call propGetType
Result: 1
Call propToInteger
Result: 0
Call propGetType
Result: 1
Call propGetName
Result: HeightScale
Call elGetProperty
Result: 0x24e792c
Call propGetType
Result: 1
Call propToInteger
Result: 255
Call propGetType
Result: 1
Call propGetName
Result: AlphaBlendValue
Call elGetProperty
Result: 0x24e7940
Call propGetType
Result: 2
Call propToString
Result: Form
Call propGetType
Result: 2
Call propIsTranslate
Result: 0
Call propGetName
Result: Caption
Call elGetProperty
Result: 0x24e7954
Call propGetType
Result: 4
Call propToByte
Result: 2
Call propGetType
Result: 4
Call propGetName
Result: BorderStyle
Call elGetProperty
Result: 0x24e7968
Call propGetType
Result: 4
Call propToByte
Result: 0
Call propGetType
Result: 4
Call propGetName
Result: WindowsState
Call elGetProperty
Result: 0x24e797c
Call propGetType
Result: 6
Call resAddIcon
Result: ASMA
Call propGetType
Result: 6
Call propGetName
Result: Icon
Call elGetProperty
Result: 0x24e7990
Call propGetType
Result: 4
Call propToByte
Result: 0
Call propGetType
Result: 4
Call propGetName
Result: TaskBar
Call elGetProperty
Result: 0x24e79a4
Call propGetType
Result: 14
Call propToString
Result: False
Call propGetType
Result: 14
Call propGetName
Result: DragForm
Call elGetProperty
Result: 0x24e79b8
Call propGetType
Result: 8
Call propToInteger
Result: 16777215
Call propGetType
Result: 8
Call propGetName
Result: TransparentColor
Call elGetProperty
Result: 0x24e79cc
Call propGetType
Result: 11
Call resAddBitmap
Result:
Call elGetProperty
Result: 0x24e79e0
Call propGetType
Result: 2
Call propToString
Result:
Call propGetType
Result: 2
Call propIsTranslate
Result: 0
Call propGetName
Result: SavePosName
Call elGetProperty
Result: 0x24e79f4
Call propGetType
Result: 14
Call propToString
Result: False
Call propGetType
Result: 14
Call propGetName
Result: MouseCapture
Call elGetProperty
Result: 0x24e7a08
Call propGetType
Result: 14
Call propToString
Result: False
Call propGetType
Result: 14
Call propGetName
Result: ClientSize
Call elGetProperty
Result: 0x24e7a1c
Call propGetType
Result: 14
Call propToString
Result: poNone
Call propGetType
Result: 14
Call propGetName
Result: Position
Call elGetProperty
Result: 0x24e7a30
Call propGetType
Result: 1
Call propToInteger
Result: 0
Call propGetType
Result: 1
Call propGetName
Result: ShiftLeft
Call elGetProperty
Result: 0x24e7a44
Call propGetType
Result: 1
Call propToInteger
Result: 0
Call propGetType
Result: 1
Call propGetName
Result: ShiftTop
Call elGetProperty
Result: 0x24e7a58
Call propGetType
Result: 20
Call elGetProperty
Result: 0x24e7a6c
Call propGetType
Result: 20
Call elGetFlag
Result: 522
Call elGetCodeName
Result: MainForm_2577B50
Call sdkGetCount
Result: 1
Call sdkGetElement
Result: 0x2577b50
Call sdkGetCount
Result: 1
Call sdkGetElement
Result: 0x2577b50
Call elGetFlag
Result: 522
Call elGetPtCount
Result: 7
Call elGetPt
Result: 0x25f08b8
Call ptGetRLinkPoint
Result: 0x0
Call elGetPt
Result: 0x25f09d8
Call ptGetRLinkPoint
Result: 0x0
Call elGetPt
Result: 0x25f0990
Call ptGetRLinkPoint
Result: 0x0
Call elGetPt
Result: 0x25f0948
Call ptGetRLinkPoint
Result: 0x0
Call elGetPt
Result: 0x25f0a68
Call ptGetRLinkPoint
Result: 0x0
Call elGetPt
Result: 0x25f0ab0
Call ptGetRLinkPoint
Result: 0x0
Call elGetPt
Result: 0x25f0b40
Call ptGetRLinkPoint
Result: 0x0
Call sdkGetCount
Result: 1
Call sdkGetElement
Result: 0x2577b50
Call elGetFlag
Result: 522
Call elGetPropCount
Result: 38
Call elGetProperty
Result: 0x24e7788
Call propGetType
Result: 1
Call elGetProperty
Result: 0x24e779c
Call propGetType
Result: 1
Call elGetProperty
Result: 0x24e77b0
Call propGetType
Result: 1
Call elGetProperty
Result: 0x24e77c4
Call propGetType
Result: 1
Call elGetProperty
Result: 0x24e77d8
Call propGetType
Result: 14
Call elGetProperty
Result: 0x24e77ec
Call propGetType
Result: 8
Call elGetProperty
Result: 0x24e7800
Call propGetType
Result: 15
Call elGetProperty
Result: 0x24e7814
Call propGetType
Result: 14
Call elGetProperty
Result: 0x24e7828
Call propGetType
Result: 14
Call elGetProperty
Result: 0x24e783c
Call propGetType
Result: 14
Call elGetProperty
Result: 0x24e7850
Call propGetType
Result: 14
Call elGetProperty
Result: 0x24e7864
Call propGetType
Result: 14
Call elGetProperty
Result: 0x24e7878
Call propGetType
Result: 1
Call elGetProperty
Result: 0x24e788c
Call propGetType
Result: 4
Call elGetProperty
Result: 0x24e78a0
Call propGetType
Result: 4
Call elGetProperty
Result: 0x24e78b4
Call propGetType
Result: 2
Call elGetProperty
Result: 0x24e78c8
Call propGetType
Result: 2
Call elGetProperty
Result: 0x24e78dc
Call propGetType
Result: 20
Call propGetLinkedElementInfo
Result: 0x0
Call elGetCodeName
Result: MainForm_2577B50
Call propGetName
Result: HintManager
Call elGetProperty
Result: 0x24e78f0
Call propGetType
Result: 20
Call propGetLinkedElementInfo
Result: 0x0
Call elGetCodeName
Result: MainForm_2577B50
Call propGetName
Result: Layout
Call elGetProperty
Result: 0x24e7904
Call propGetType
Result: 1
Call elGetProperty
Result: 0x24e7918
Call propGetType
Result: 1
Call elGetProperty
Result: 0x24e792c
Call propGetType
Result: 1
Call elGetProperty
Result: 0x24e7940
Call propGetType
Result: 2
Call elGetProperty
Result: 0x24e7954
Call propGetType
Result: 4
Call elGetProperty
Result: 0x24e7968
Call propGetType
Result: 4
Call elGetProperty
Result: 0x24e797c
Call propGetType
Result: 6
Call elGetProperty
Result: 0x24e7990
Call propGetType
Result: 4
Call elGetProperty
Result: 0x24e79a4
Call propGetType
Result: 14
Call elGetProperty
Result: 0x24e79b8
Call propGetType
Result: 8
Call elGetProperty
Result: 0x24e79cc
Call propGetType
Result: 11
Call elGetProperty
Result: 0x24e79e0
Call propGetType
Result: 2
Call elGetProperty
Result: 0x24e79f4
Call propGetType
Result: 14
Call elGetProperty
Result: 0x24e7a08
Call propGetType
Result: 14
Call elGetProperty
Result: 0x24e7a1c
Call propGetType
Result: 14
Call elGetProperty
Result: 0x24e7a30
Call propGetType
Result: 1
Call elGetProperty
Result: 0x24e7a44
Call propGetType
Result: 1
Call elGetProperty
Result: 0x24e7a58
Call propGetType
Result: 20
Call propGetLinkedElementInfo
Result: 0x0
Call elGetCodeName
Result: MainForm_2577B50
Call propGetName
Result: TransparentManager
Call elGetProperty
Result: 0x24e7a6c
Call propGetType
Result: 20
Call propGetLinkedElementInfo
Result: 0x0
Call elGetCodeName
Result: MainForm_2577B50
Call propGetName
Result: FormFastening
Call elGetClassIndex
Result: 10
Call elGetClassIndex
Result: 10
Call sdkGetCount
Result: 1
Call sdkGetElement
Result: 0x2577b50
Call elGetParent
Result: 0x2576570
Call sdkGetParent
Result: 0x0
Call elGetCodeName
Result: MainForm_2577B50
Call sdkGetCount
Result: 1
Call sdkGetElement
Result: 0x2577b50
Call elGetFlag
Result: 522
Call sdkGetElement
Result: 0x2577b50
Call elGetCodeName
Result: MainForm_2577B50
Call sdkGetElement
Result: 0x2577b50
Call GetParam
Result: 0
Call resAddFile
Result: 0
Result: 0

Пришлось отказаться от использования структуры TCodeGenTools, т.к. она больше сбивает с толку, с её полями-указателями на функции, ещё и неудобно в неё тыкать указатели на свои функции
Так что у меня все функции находятся в массиве указателей.
Код как всегда тут: https://github.com/CriDos/HiAsm_ProxyInterface
Позже добавлю больше информации для вывода.
------------ Дoбавленo в 14.43:
Немного причесал код и добавил вывод информации об аргументах функций и их значениях на момент вызова.
Обновлённый вывод: http://pastebin.com/vmh4uGq4
карма: 1
1
Голосовали:Nic
Ответов: 2059
Рейтинг: 132
#221: 2015-06-11 21:09:39 ЛС | профиль | цитата
CriDos,
Правильно я понимаю, что речь идёт о структуре, где вызовы "компонентов" через CALL, или указатели?
[flood]На медне делал компонент - получилась туча точек. Разбил на шесть (тусовал функционал туда, сюда) и пришёл в ужас от того, что каждый компонент в HiAsm прописан отдельным кодом, а не как uses или функция.
Понятно, что hiFunction и hiCallFunction - плохая замена овсу.[/flood]
карма: 6

0
Ответов: 1841
Рейтинг: 369
#222: 2015-06-11 21:49:06 ЛС | профиль | цитата
flint2 писал(а):
что речь идёт о структуре, где вызовы "компонентов" через CALL?

Что ещё за вызовы "компонентов" через CALL?
Имеются ввиду callback функции?
Если Вы имеете ввиду структуру TCodeGenTools, то она больше похожа на массив, чем на структуру.
Данные этой структуры организованы в памяти таким же образом, как и в обычном массиве (относительно GCC C/C++/delphi4), и имеют одинаковый тип данных, что делает возможным работать со структурой TCodeGenTools также, как и с обычным массивом.
Ну а каждое поле этой структуры, является обычным адресом (указателем) на начало блока памяти в области HiAsm.exe, где и расположена функция.
Далее, в C++ мы говорим компилятору, что у нас есть переменная-указатель, которая содержит адрес на вот такую функцию и описываем её сигнатуру, ну и вызываем её
Через сами функции, мы не вызываем компоненты, лишь получаем из среды какую либо информацию об элементе или данных, которые он хранит/привязаны к нему и используем эту информацию для генерации кода.
Как-то так.
карма: 1
1
Голосовали:flint2
Ответов: 2059
Рейтинг: 132
#223: 2015-06-12 10:13:16 ЛС | профиль | цитата
CriDos,
Спасибо, ПОНЯЛ.

Ну а каждое поле этой структуры, является обычным адресом (указателем) на начало блока памяти в области HiAsm.exe
...
Далее, в C++ мы говорим компилятору, что у нас есть переменная-указатель, которая содержит адрес на вот такую функцию и описываем её сигнатуру

...И про callback тоже.
[flood]
Что ещё за вызовы "компонентов" через CALL?

Я имел ввиду, что вызов кода компонента происходит через ассемблерную команду CALL, что код компонента прописан только один раз, а не как сейчас.
Т.е. если в схеме стоит 20 одинаковых компонентов, то и в *.exe присутствует код на все 20 компонент.
Сейчас это похоже на JMP на всё новый и новый код (это образно).
[/flood]
Начал вникать, а то не всё прочитал.
Понравилось!
Сразу есть мысли, но надо подумать, как их правильно изложить.
...И прочитать всё с начала до конца!
карма: 6

0
Ответов: 1841
Рейтинг: 369
#224: 2015-06-12 14:59:18 ЛС | профиль | цитата
flint2 писал(а):
Я имел ввиду, что вызов кода компонента происходит через ассемблерную команду CALL, что код компонента прописан только один раз, а не как сейчас.

        91 [1]        int res = m_cgt->sdkGetCount(SDK);
0x6e8c232a <+0x00b8> a1 44 30 8d 6e mov 0x6e8d3044,%eax
0x6e8c232f <+0x00bd> 8b 10 mov (%eax),%edx
0x6e8c2331 <+0x00bf> 8b 45 08 mov 0x8(%ebp),%eax
0x6e8c2334 <+0x00c2> 89 04 24 mov %eax,(%esp)
0x6e8c2337 <+0x00c5> ff d2 call *%edx
0x6e8c2339 <+0x00c7> 83 ec 04 sub $0x4,%esp
0x6e8c233c <+0x00ca> 89 45 f4 mov %eax,-0xc(%ebp)
или вот
        102 [1]        id_element res = m_cgt->sdkGetElement(SDK, Index);
0x6e8c24c7 <+0x00b8> a1 44 30 8d 6e mov 0x6e8d3044,%eax
0x6e8c24cc <+0x00bd> 8b 50 04 mov 0x4(%eax),%edx
0x6e8c24cf <+0x00c0> 8b 45 0c mov 0xc(%ebp),%eax
0x6e8c24d2 <+0x00c3> 89 44 24 04 mov %eax,0x4(%esp)
0x6e8c24d6 <+0x00c7> 8b 45 08 mov 0x8(%ebp),%eax
0x6e8c24d9 <+0x00ca> 89 04 24 mov %eax,(%esp)
0x6e8c24dc <+0x00cd> ff d2 call *%edx
0x6e8c24de <+0x00cf> 83 ec 08 sub $0x8,%esp
0x6e8c24e1 <+0x00d2> 89 45 f4 mov %eax,-0xc(%ebp)

flint2 писал(а):
код компонента прописан только один раз, а не как сейчас.

Тут как такового, нет кода компонента.
Есть среда с API (callback).
Ты получаешь в своё распоряжение ID контейнера (основная схема) и массив функций для работы с этим контейнером, его объектами/свойствами/параметрами и т.д.
Далее, ты с помощью этого API перебираешь объекты в этом контейнере (элементы), читая их параметры, передавая ID параметров в другие вспомогательные функции, получая информацию.
Вот так вот кодогенератор и переребирает один за другим элементы/контейнеры/etc.
И тут неважно Delphi, FTCG или RTCG кодогенератор, все они используют одинаковый принцип получения информации о схеме (разная последовательность и другие нюансы могут отличаться).
Куда и сколько экземпляров кода элемента писать, уже решает кодогенератор.
карма: 1
0
Ответов: 2059
Рейтинг: 132
#225: 2015-06-12 15:38:03 ЛС | профиль | цитата
CriDos,
Тут как такового, нет кода компонента.

Это главное!

Есть среда с API (callback).
Куда и сколько экземпляров кода элемента писать, уже решает кодогенератор.

Это я потом понял.
Одно дело собрать информацию - пропарсить схему, а другое сгенерить код.

----------------------------------------------------------------------------------------------
Конечный код получается без мусора в виде незадействованного кода?
Т.е. целевая компиляция?
Т.е. если таскать за собой, предположим dll от QT, то получается избыточный код в виде незадействованных функций dll.
Или большие uses библиотеки, из которых 80% функций не задействовано.
Это как пример.

Лирика:
[flood]Я как то делал программку для выдирания нужных кусков кода из dll в виде ассемблерного кода. С метками, переменными и т.д.[/flood]
карма: 6

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)