Вверх ↑
Ответов: 1841
Рейтинг: 369
#1: 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