Обратный звонок в Free Pascal из C ++ DLL

В собственном заголовке DLL есть объявления:

class CJDummyClass
{
};
typedef CJDummyClass * J_IMG_CALLBACK_OBJECT;
#ifdef __BORLANDC__
typedef void (__stdcall*J_IMG_CALLBACK_FUNCTION)(J_tIMAGE_INFO * pAqImageInfo);
#else
typedef void (CJDummyClass::*J_IMG_CALLBACK_FUNCTION)(J_tIMAGE_INFO * pAqImageInfo);
#endif

Также есть экспортируемая функция для связи функции обратного вызова с DLL, и затем можно обрабатывать некоторые данные, помещенные в память, указателем pAqImageInfo.

Я пишу приложение с использованием этой библиотеки DLL во FreePascal, почти все, что мне нужно, успешно переведено, динамически связано и обернуто в класс, но теперь у меня проблема с функцией обратного вызова.
Вот часть моего кода:

interface
type
pJ_tIMAGE_INFO = ^J_tIMAGE_INFO;
TJ_IMG_CALLBACK_FUNCTION = procedure( const pAqImageInfo: pJ_tIMAGE_INFO ) of object; cdecl;
PJ_IMG_CALLBACK_FUNCTION = ^TJ_IMG_CALLBACK_FUNCTION;

TJaiFactory = class( TObject )
.....
procedure ImageCallback( const pAqImageInfo: pJ_tIMAGE_INFO ); cdecl;
.....
end;
implementation
procedure TJaiFactory.ImageCallback(pAqImageInfo: pJ_tIMAGE_INFO); cdecl;
begin
// some data processing here
end;

Insidy мой ImageCallback Я получил pAqImageInfo = nil вместо некоторого фактического указателя. Я подозреваю, что я должен определить тип или параметры для обратного вызова другим способом, но я не знаю, как.

Первый вопрос: если в C ++ есть функция void, то, насколько я понимаю, это процедура в терминах Паскаля, и она должна быть определена как процедура или как функция с некоторым указателем результата (но без фактического результата)?

Второй вопрос: если функция объявлена ​​в C ++ как член класса, каков правильный способ перевода типа этой функции в Pascal? Я не уверен, что происходит с указателем «this».

Спасибо.

0

Решение

  1. Процедура эквивалентна пустой функции в C / C ++.
  2. В Visual C ++ this указатель передается в ecx регистрация и соглашение о вызовах по умолчанию для функции-члена эквивалентно __stdcall кроме случаев, когда вы передали аргумент variadic, он изменится на __cdecl, Ваш обратный вызов должен быть правильным, за исключением соглашения о вызовах.
1

Другие решения

  1. A * bla () эквивалентно bla (). IOW ТИП функции является неявным указателем в Паскале.
  2. Класс C ++ не может быть представлен в другом компиляторе. Даже два компилятора C ++ будут иметь разные представления.
  3. в результате (2) тип функции не является объектом OBJECT. Это не класс Паскаля. OF OBJECT сделает тип функции типом с двумя указателями (экземпляр + адрес), а это понятие, которого нет в C ++.

Так

 Type
J_IMG_CALLBACK_FUNCTION = procedure (pAqImageInfo:Pointer); StdCall;
// or cdecl depending on compiler

разумное приближение.

0