В собственном заголовке 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».
Спасибо.
this
указатель передается в ecx
регистрация и соглашение о вызовах по умолчанию для функции-члена эквивалентно __stdcall
кроме случаев, когда вы передали аргумент variadic, он изменится на __cdecl
, Ваш обратный вызов должен быть правильным, за исключением соглашения о вызовах.Так
Type
J_IMG_CALLBACK_FUNCTION = procedure (pAqImageInfo:Pointer); StdCall;
// or cdecl depending on compiler
разумное приближение.