Есть декларации в собственной DLL заголовка:Ответный в Free Pascal от C++ 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 = ноль вместо некоторого фактического указателя. Я подозреваю, что мне нужно определить тип или параметры для обратного вызова каким-то другим способом, но я не знаю, как это сделать.
Первый вопрос: если в C++ существует функция void, то насколько я понимаю, это процедура в терминах Pascal, и она должна быть определена как процедура или как функция с некоторым результатом указателя (но без фактического результата)?
Второй вопрос: если функция, объявленная в C++ как член класса, является правильным способом перевести тип этой функции в Pascal? Я не уверен, что происходит с этим «указателем».
спасибо.
спасибо. Но я все еще не понимаю о вызове конвенции для функции-члена. Как объявить его в Паскале? Должен ли я заявить что-то или предоставить что-то, чтобы сделать обратный вызов правильным? Я не уверен, но похоже, что нуль в указателе равен нулю для «этого». Я тоже пробовал stdcall, и результат был таким же - ноль в указателе. –
Является DLL x86? А что такое компилятор, который использует DLL? Является ли вызов конвенции для функции-члена в Free Pascal такой же, как Delphi? Я ничего не знаю о Free Pascal. Но в Delphi первый аргумент передается в регистре edx. – UltimaWeapon
DLL - x86, компилятор Free Pascal - тоже x86, а в режиме delphi-совместимости (когда он был в режиме objfpc по умолчанию, функция обратного вызова вообще не была связана). –