c++ - 在 Delphi 应用程序中使用 C++ DLL 回调函数

标签 c++ delphi dll callback

我尝试在我的 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 函数。 ?

最佳答案

据我所知,您不能直接导入 C++ 类来映射 Delphi 类。也就是说,即使您获得了指向 AudioChunk 实例的指针,您也无法直接从 Delphi 访问它。因此无法直接使用您的回调。

所以你必须手动定义一个"flat" C interface在 Delphi 中导入,它将在 C++ 中实现回调,然后将接口(interface)公开为 C 函数,参数为 C struct 而不是 C++ boost 类。

关于c++ - 在 Delphi 应用程序中使用 C++ DLL 回调函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8294267/

相关文章:

Delphi 64 位预览编译器可用吗?

delphi - E2010 不兼容类型,为什么?

c++ - QT 5.3 发布应用

c++如何在运行时链接函数声明?

visual-studio-2010 - 在visual studio 2010中将带有资源文件的dll部署到sharepoint 2010

c++ - 使用 ostringstream 将 double 格式化为字符串

c++ - 仅寻址 WORD 的 15 位

c++ - 在 Mac 和 Windows 上部署 Qt+Boost 应用程序

c++ - 从不同线程调用对象的成员函数 : how to use mutex correctly?

delphi - 调试信息 {$D+} 使我的 EXE 大小增加了 6MB