Вверх ↑
Ответов: 1841
Рейтинг: 369
#1: 2014-12-05 20:43:33 ЛС | профиль | цитата
[offtop]
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]
карма: 1
1
Голосовали:Nic