DelphiからC++コードを呼び出す必要があります。 C++コードは、代わりにDelphiコードにコールバックできる必要があります。ここに示した例はCalling a callback function in Delphi from a C++ DLLです。しかし、C++にコールバックとして単一のDelphi関数を渡すのではなく、インタフェースを実装するDelphiオブジェクトを渡したいと思います。DelphiおよびC++クラスのVMTは互換性がありますか?
編集:私はC++の用語を参照しています。これは純粋な仮想関数を持つクラスです。これは必ずしもDelphi interface
キーワードで定義されたタイプではありません。換言すれば、以下のクラスは、私はC++から呼び出したいインターフェイスを定義:
ICallable = class
procedure callMe stdcall; virtual; abstract;
procedure CallMeAgain stdcall; virtual; abstract;
end;
次のようにICallable
インタフェースが順番にDelphiで実装される:C++側
MyCallable = class(ICallable)
procedure callMe override;
procedure callMeAgain override;
end;
procedure MyCallable.callMe
begin
WriteLine('I was called');
end;
procedure MyCallable.callMeAgain
begin
WriteLine('I was called again');
end;
をこれは、私は次のようにICallableインタフェースを定義したい、DLLとしてコンパイルされています
class ICallable{
public:
virtual void callMe()=0;
virtual void callMeAgain()=0;
}
そして、それは、Delphiで呼び出すことができるように、次のDLL関数をエクスポート:
#define DllExport extern "C" __declspec(dllexport)
DLLExport bool Callback(ICallable* callable){
callable->callMe();
callable->callMeAgain();
return true;
}
そして最終的に戻って、Delphiで:
function Callback(myCallable: ICallable) : Boolean cdecl; external 'dllname'
質問:
- C++とDelphiは、同じように自分の仮想メソッドテーブルを実装する場合にのみを働かせることができます。これは本当ですか?
デルファイのインターフェイスはCOM規則に従います。ですから、C++のCOM規約に従う必要があります。http://rvelthuis.de/articles/articles-cppobjs.htmlとhttp://www.scritub.com/stiinta/tutorials/visual-c-en/Sharing-コードとオブジェクト-Betwe18279520.php – Johan
DelとDelのインタフェースは 'interface'キーワードを使って宣言します。非COMインタフェースを宣言することを主張するなら、あなたは '抽象クラス'を使います。インターフェースの実装は 'TInterfacedObject'から派生しています。 – Johan
@Johan私はここでCOMマシン全体を明示的に回避しようとしています。また、私の場合は、C++ COMコンポーネントを設計していません。私はC++と同じ "インタフェース"を "共有"するDelphiオブジェクトへのコールバックができるようにしたいと考えています。本質的には、仮想抽象メソッドを持つDelphiクラスが、純粋な仮想関数を持つ対応するC++クラスにマップされているかどうかを知りたい場合 – BigONotation