Передача указателя из Си++ в Dll на Delphi

  • Автор темы vladimirFF
  • Дата начала
V

vladimirFF

#1
Доброго всем времени суток!

При передаче указателя на блок памяти из кода на Си++ в длл-функцию, написанную на дельфи, обнаруживаю в этом блоке памяти совсем другие данные.

Есть библиотека DLL, написанная на delphi. В ней функция вида:
function sendData(<тут разные параметры>; data: Pointer): BYTE; stdcall;
begin
with TFileStream.Create('dump.dat',fmOpe nWrite) do try
write(data,wSize);
finally
free();
end;
end;

ее объявление в Си:
typedef BYTE (WINAPI *SendData)(BYTE, WORD, BYTE, void*);


и код в си:
void* data;
data = malloc(size);
//дальше в память, куда указывает data записываются данные
memcpy(data,&val,sz);
//и собственно вызов функции DLL
sendData(catId,size,objCount,data);


Проблема в следующем: то что я записываю в data в Си и то что я получаю в DLL-фнкции - совершенно разные данные. Ошибки доступа к памяти при этом не возникает.

Подскажите в чем может быть причина?
 
O

Odin_KG

#2
Логично предположить, что аргументы в функцию передаются по другим правилам. А другие функции из этой же DLL нормально работают?
 
V

vladimirFF

#3
спасибо, что откликнулись.
да другие функции работают без проблем - в частности аналогичная функция, которая действует наоборот:
память выделяется и заполняется в delphi, и передается в Си указателем - все ок.
А вот из Си в delphi - никак, получаю работающий кусок памяти, заполненный всяким мусором и нулями.
Размер куска пробовал от 10 байт до 800.
 
O

Odin_KG

#4
аналогичная функция, которая действует наоборот:
память выделяется и заполняется в delphi, и передается в Си указателем - все ок.
Ну, может быть в данном случае возврат идет через return.

А вот из Си в delphi - никак, получаю работающий кусок памяти, заполненный всяким мусором и нулями.
Ответ какой-то неоднозначный получился :) Я спрашивал, работают ли у вас остальные функции при вызове из C? То, что они из Delphi работают это и так понятно.

Вообще такая конструкция по объявлению функции на C мне кажется чересчур мудреной:
typedef BYTE (WINAPI *SendData)(BYTE, WORD, BYTE, void*);
может по-проще написать?

Чтобы библиотеку подключать к C++ обычно используют h-файл и lib-файл, которые прилагаются к DLL. Если у вас их нет, то, честно говоря, мне не ясно как вы вообще библиотеку подключаете. Тогда вроде как загружать библиотеку надо через LoadLibrary и потом руками вынимать из неё функции.

спасибо, что откликнулись.
пожалуйста
 
V

vladimirFF

#5
Ответ какой-то неоднозначный получился :) Я спрашивал, работают ли у вас остальные функции при вызове из C? То, что они из Delphi работают это и так понятно.
Они работают из Си. просто данные формируются в dll (которая на дельфи), а используются в Си - это я имел ввиду

Вообще такая конструкция по объявлению функции на C мне кажется чересчур мудреной:
typedef BYTE (WINAPI *SendData)(BYTE, WORD, BYTE, void*);
может по-проще написать?
а как проще?

Чтобы библиотеку подключать к C++ обычно используют h-файл и lib-файл, которые прилагаются к DLL. Если у вас их нет, то, честно говоря, мне не ясно как вы вообще библиотеку подключаете. Тогда вроде как загружать библиотеку надо через LoadLibrary и потом руками вынимать из неё функции.

к библиотеке ничего не прилагается, потому что я ее сам же и написал :)
Подключаю именно динамически через LoadLibrary
 
O

Odin_KG

#6
Можно так попробовать:
BYTE* WINAPI SendData(BYTE, WORD, BYTE, void*);

Функции все лучше перечислить в отдельном h-файле. В начале файла можно попробовать поставить:
#ifdef __cplusplus
extern "C" {
#endif

тут перечисляем функции
...
...
...

а в конце:
#ifdef __cplusplus
}
#endif


к библиотеке ничего не прилагается, потому что я ее сам же и написал
Ну, это похвально :) Я к сожалению в Delphi не очень разбираюсь. На C только могу сделать.