Вверх ↑
Ответов: 1841
Рейтинг: 369
#1: 2014-12-04 22:54:47 ЛС | профиль | цитата
Флуд не по теме
Netspirit писал(а):
Нет, pascal (или register).

Тут не всё так просто
Я изначально использовал соглашение «extern "C" __cdecl».
После неудачных попыток передачи УКАЗАТЕЛЯ по ССЫЛКЕ (*&):
#pas
procedure _hi_PointsInfo(var _prop_WorkPoints,_prop_EventPoints,_prop_VarPoints,_prop_DataPoints:PChar); export;
, решил поиграться с соглашениями и глянуть, чего там объявлено в windows.h.Там имеем #define PASCAL __stdcall, но, нам не подходит, т.к. HiAsm не увидит экспортированные функции из-за декоратора имён (_Z14_hi_PointsInfoRPcS0_S0_S0_@16)...
В попытке решить данную проблему, делаем «#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;
У меня собственно вопрос к знатокам Delphi/FPC.
Зачем использовать ссылку на указать на массив из 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)

Забывать уже начал, особенность синтаксиса передачи аргументов паскаля
Все ссылки, однако...
карма: 1
0