Используйте функцию обратного вызова C ++ DLL в приложении Delphi - PullRequest
1 голос
/ 28 ноября 2011

Я пытаюсь использовать функцию C ++ DLL в моем приложении Delphi.У меня проблема с использованием функции обратного вызова, например:

Определения экспортируемых функций в C ++:

typedef void (__CDECL__* RegisterCallBacksFunction)(AudioChunkCallBackFunction, CaptureEventCallBackFunction, LogMngr*);

Определения обратного вызова:

typedef void (__CDECL__*AudioChunkCallBackFunction)(AudioChunkRef, CStdString& capturePort);
typedef void (__CDECL__*CaptureEventCallBackFunction)(CaptureEventRef, CStdString& capturePort);

AudioChunkRef и CaptureEventRef:

typedef boost::shared_ptr<AudioChunk> AudioChunkRef;
typedef boost::shared_ptr<CaptureEvent> CaptureEventRef;

А AudioChunk и CaptureEvent относятся к классу C ++:

class __declspec( dllexport ) AudioChunk // or CaptureEvent (both are similar)
{
public:
//some functions and variables
private:
//some functions and variables
};

Экспорт библиотеки C ++:

extern "C"
{
__declspec( dllexport ) void __CDECL__  RegisterCallBacks(AudioChunkCallBackFunction, CaptureEventCallBackFunction, LogMngr*);
}

Как использовать функцию RegisterCallBacks в моем приложении Delphi.

Ответы [ 2 ]

4 голосов
/ 28 ноября 2011

AFAIK Вы не можете импортировать классы C ++ напрямую для сопоставления классов Delphi.То есть, даже если вы получите указатель на экземпляр AudioChunk, вы не сможете получить к нему доступ напрямую из Delphi.Таким образом, использование ваших обратных вызовов не будет возможно напрямую.

Так что вам придется вручную определить "плоский" интерфейс C , который будет импортирован в Delphi, который будет реализовывать обратный вызовв C ++ представьте интерфейс как функции C с параметрами C struct вместо C ++ boost классы.

1 голос
/ 28 ноября 2011

Соглашения об именах разных языков (таких как Pascal и C ++) - очень сложная тема.По крайней мере, C ++ не допускает, чтобы при переходе от одного поставщика к другому сохранялось одно и то же имя экспорта для определенных методов.Например: Eleven@SomeClass@@QAEHXZ - это объявление int SomeClass::Eleven() для MSVC.Единственный работоспособный способ - это объявление C, использующее extern "C" предоставленное стандартными соглашениями.

А как же классы?Чтобы избежать повторного изобретения колеса - для случая Delphi-C ++ используйте OLE / COM, в общем случае вы объявите интерфейс и сможете сделать то же самое с обеих сторон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...