6

私が書いたC++DLLには、関数ポインター(コールバック関数)をパラメーターとして受け取る単一の公開された関数があります。

#define DllExport   extern "C" __declspec( dllexport )

DllExport bool RegisterCallbackGetProperty( bool (*GetProperty)( UINT object_type, UINT object_instnace, UINT property_identifer, UINT device_identifier, float * value ) ) {
    // Do something. 
}

この公開されたC++DLL関数をDelphiアプリケーション内から呼び出して、将来使用するコールバック関数を登録できるようにしたいと思います。しかし、公開されたC++DLL関数で動作する関数ポインターをDelphiで作成する方法がわかりません。

この質問で得たヘルプから、Delphiアプリケーションが単純な公開されたc++DLL関数を呼び出しています。

私はC++DLLを構築しており、必要に応じてそのパラメーターを変更できます。

私の質問は次のとおりです。

  • Delphiで関数ポインタを作成する方法
  • Delphiアプリケーション内から公開されたC++DLL関数を正しく呼び出して、C++DLL関数が関数ポインターを使用できるようにする方法。
4

1 に答える 1

12

関数型を宣言することにより、Delphi で関数ポインタを宣言します。たとえば、コールバックの関数型は次のように定義できます。

type
  TGetProperty = function(object_type, object_instnace, property_identifier, device_identifier: UInt; value: PSingle): Boolean; cdecl;

cdecl呼び出し規則は、C++ コードで呼び出し規則が指定されていないためであり、cdecl は C++ コンパイラの通常の既定の呼び出し規則であることに注意してください。

次に、その型を使用して DLL 関数を定義できます。

function RegisterCallbackGetProperty(GetProperty: TGetProperty): Boolean; cdecl; external 'dllname';

'dllname'DLL の名前に置き換えます。

DLL 関数を呼び出すには、最初に、コールバック タイプと一致するシグネチャを持つ Delphi 関数が必要です。例えば:

function Callback(object_type, object_instnace, property_identifier, device_identifier: UInt; value: PSingle): Boolean cdecl;
begin
  Result := False;
end;

次に、DLL 関数を呼び出して、他の変数と同じようにコールバックを渡すことができます。

RegisterCallbackGetProperty(Callback);
于 2012-06-20T21:42:16.630 に答える