Netspirit писал(а):
Поэтому "массив из char" всё же лежит не в стеке и не уничтожается после выхода из процедуры, поэтому его адреса остаются валидными.Так то и я думал, но, что то оно как то не так работает в данном случае, видимо
Или с вызовами что то.
Netspirit писал(а):
А вообще, в таких случаях вызывающий сам готовит буфер, передаёт его адрес в dll, а она туда копирует нужные данные. Так работает Windows API. Ну и ещё в dll может быть возможность предварительно узнать требуемый размер буфера. Также dll может сама выделять буфер, но предоставлять функцию для его освобождения, когда данные больше не нужны.Я про это и говорю, что не надо было делать так, как сейчас сделано.
Попробую сейчас в lazarus сделать аналогичный функционал и глянуть, чего там в памяти творится.[/offtop]
------------ Дoбавленo в 19.26:
[offtop]Вот, потихоньку всё встаёт на свои места
На стеке вызовов фигня творится.
В случае, если обе стороны используют cdecl, всё ок, передаются корректные адреса переменных, но, как только паскалевская библиотека экспортирует процедуру с ключевым словом export, пиши пропало, из C++ никак не могу корректно передать в неё данные...
Буду дальше копать [/offtop]
------------ Дoбавленo в 20.13:
[offtop]Всё же я оказался прав относительно fastcall
wiki писал(а):
В компиляторе Borland, для соглашения __fastcall, называемого также register[5], параметры передаются слева направо в eax, edx, ecx и, если параметров больше трёх, в стеке, также слева направо. Указатель стека на исходное значение возвращает вызываемая подпрограмма.
Fastcall Borland применяется по умолчанию в Delphi.
Соглашение __fastcall Microsoft, также называемое __msfastcall, в 32-разрядной версии компилятора Microsoft[6], а также компилятора GCC[7], определяет передачу первых двух параметров слева направо в ecx и edx, а остальные параметры передаются справа налево в стеке. Очистку стека производит вызываемая подпрограмма.
Осталось корректно передать параметры с учётом соглашения и можно попробовать сделать шаблон компонента
[/offtop]
------------ Дoбавленo в 21.43:
[offtop]Ох и намудрили с этими вызовами
Решил таки сию задачу.
Вот так вот следует объявлять прототип внешней registerexport (fastcall) функции в C++ GNU (GCC):
#cpp
extern "C" __attribute__((regparm(3))) void _hi_PointsInfo(PChar &t1, PChar &t2, PChar &t3, PChar &t4);
Или если вы используете Qt:
#cpp
extern "C" QT_FASTCALL void _hi_PointsInfo(PChar &t1, PChar &t2, PChar &t3, PChar &t4);
Вызовы корректно конвертируются и возможно использовать более 3 аргумента
[/offtop]