我尝试在我的Delphi应用程序中使用C ++ DLL函数。我有使用回调函数的问题:
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*);
}
如何在我的Delphi应用程序中使用RegisterCallBacks功能。 ?
答案 0 :(得分:4)
AFAIK你不能直接导入C ++类来映射Delphi类。也就是说,即使你得到一个指向AudioChunk
实例的指针,你也无法直接从Delphi访问它。因此,无法直接使用您的回调。
所以你必须手动定义要在Delphi中导入的"flat" C interface,它将在C ++中实现回调,然后将接口公开为C函数,参数为C struct
而不是C ++ boost 类。
答案 1 :(得分:1)
不同语言的命名约定(如Pascal和C ++)是非常复杂的主题。至少C ++不允许从一个供应商迁移到另一个供应商将保留特定方法的相同导出名称。例如:Eleven@SomeClass@@QAEHXZ
- 是MSVC的int SomeClass::Eleven()
声明。唯一可行的方法是使用标准约定授予的extern "C"
进行C声明。
但课程怎么样?为了避免轮重新发明 - 例如Delphi-C ++使用OLE / COM,通常你会声明接口并且能够在两侧做同样的事情。