Флуд не по теме
Netspirit писал(а):
Нет, pascal (или register).Тут не всё так просто
Я изначально использовал соглашение «extern "C" __cdecl».
После неудачных попыток передачи УКАЗАТЕЛЯ по ССЫЛКЕ (*&):
#pas
procedure _hi_PointsInfo(var _prop_WorkPoints,_prop_EventPoints,_prop_VarPoints,_prop_DataPoints:PChar); export;
В попытке решить данную проблему, делаем «#define EXPORT extern "C" PASCAL» и получаем "_hi_PointsInfo@16", т.е. декорированное имя, хотя и короче
ОК, пробуем получить параметры из HiAsm библиотеки в C++.
Подключаем HiDLL.def к проекту:
#cpp
EXPORTS
_hi_PointsInfo=_hi_PointsInfo@16
#cpp
#define DLL_IMPORT extern "C" PASCAL
typedef char *PChar;
DLL_IMPORT void _hi_PointsInfo(PChar &workPoints,
PChar &eventPoints,
PChar &varPoints,
PChar &dataPoints);
int main(int argc, char *argv[])
{
//На всякий случай выделим памяти, вдруг чего :lol:
PChar t1 = new char[255]{};
PChar t2 = new char[255]{};
PChar t3 = new char[255]{};
PChar t4 = new char[255]{};;
_hi_PointsInfo(t1, t2, t3, t4);
//t1 = "doWork" - УРА, записалось :lol:
//t2 = "" - пусто :(
//t3 = "" - пусто :(
//t4 - падаем :D
return 0;
}
А вот собственно экспортируемая функция HiAsm dll, которая и передать указатель на массив по ссылке:
#pas
procedure _hi_PointsInfo(var _prop_WorkPoints,_prop_EventPoints,_prop_VarPoints,_prop_DataPoints:PChar); export;
begin
_prop_WorkPoints := PChar('doWork'#0);
_prop_EventPoints := PChar('onEvent'#0);
_prop_VarPoints := PChar('Var'#0);
_prop_DataPoints := PChar('Data'#0);
end;
Зачем использовать ссылку на указать на массив из char'ов?
------------ Дoбавленo в 23.40:
Понял для чего ссылка на указатель.
Мы получается, передаём переменной _prop_WorkPoints (ссылка t1) указатель на начало массива из char в стеке, т.е. не сделали нормально и не выделили из кучи место под массив, а взяли и вернули указатель на строку из стека...
CriDos писал(а):
procedure _hi_PointsInfo(var _prop_WorkPoints,_prop_EventPoints,_prop_VarPoints,_prop_DataPointsChar); Причём вот тут, как я понимаю, аргументы _prop_VarPoints (которые без var) передаются по значению? Т.е. меняется содержимое локальной копии переменной?
------------ Дoбавленo в 23.54:
CriDos писал(а):
_prop_VarPoints (которые без var)Забывать уже начал, особенность синтаксиса передачи аргументов паскаля
Все ссылки, однако...