簡體   English   中英

在Delphi應用程序中使用C ++ DLL回調函數

[英]Use C++ DLL callback function in a Delphi application

我嘗試在我的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函數。

AFAIK,您不能直接導入C ++類來映射Delphi類。 也就是說,即使您獲得了指向AudioChunk實例的指針,也將無法直接從Delphi中訪問它。 因此,將無法直接使用回調。

因此,您必須手動定義要在Delphi中導入的“平面” C接口 ,該接口將在C ++中實現回調,然后將該接口公開為C函數,並將參數作為C struct而不是C ++ boost類。

不同語言(例如Pascal和C ++)的命名約定是非常復雜的主題。 至少C ++不允許從一個供應商遷移到另一供應商將為特定方法保留相同的導出名稱。 例如: Eleven@SomeClass@@QAEHXZ是MSVC的int SomeClass::Eleven()聲明。 唯一可行的方法是使用標准約定授予的extern "C" C聲明。

但是上課呢? 為了避免重新發明輪子-對於Delphi-C ++使用OLE / COM的情況,通常,您將聲明接口,並且可以在兩邊都做同樣的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM