0

独自の DLL ヘッダーに宣言があります。

class CJDummyClass
{
};
typedef CJDummyClass * J_IMG_CALLBACK_OBJECT;
#ifdef __BORLANDC__
  typedef void (__stdcall*J_IMG_CALLBACK_FUNCTION)(J_tIMAGE_INFO * pAqImageInfo);
#else
  typedef void (CJDummyClass::*J_IMG_CALLBACK_FUNCTION)(J_tIMAGE_INFO * pAqImageInfo);
#endif

また、コールバック関数を DLL にリンクするためのエクスポートされた関数があり、ポインタ pAqImageInfo によってメモリに配置された一部のデータを処理することが可能です。

FreePascal でこの DLL を使用してアプリケーションを作成しています。必要なほとんどすべてが正常に変換され、動的にリンクされ、クラスにラップされていますが、コールバック関数に問題があります。ここに私のコードの一部があります:

interface
type
  pJ_tIMAGE_INFO = ^J_tIMAGE_INFO;
  TJ_IMG_CALLBACK_FUNCTION = procedure( const pAqImageInfo: pJ_tIMAGE_INFO ) of object; cdecl;
  PJ_IMG_CALLBACK_FUNCTION = ^TJ_IMG_CALLBACK_FUNCTION;

  TJaiFactory = class( TObject )
  .....
    procedure ImageCallback( const pAqImageInfo: pJ_tIMAGE_INFO ); cdecl;
  .....
  end;
implementation
procedure TJaiFactory.ImageCallback(pAqImageInfo: pJ_tIMAGE_INFO); cdecl;
begin
  // some data processing here
end;

私の ImageCallback の中で、実際のポインターの代わりに pAqImageInfo = nil を取得しました。コールバックの型またはパラメーターを別の方法で定義する必要があると思われますが、その方法がわかりません。

最初の質問: C++ に void 関数がある場合、私が理解している限り、それは Pascal で言えば手続きであり、手続きとして、または何らかのポインター結果を持つ関数として定義する必要があります (ただし、実際の結果はありません)。

2 番目の質問: 関数が C++ でクラスのメンバーとして宣言されている場合、この関数の型を Pascal に変換する正しい方法は何ですか? 「この」ポインターで何が起こっているのかわかりません。

ありがとうございました。

4

2 に答える 2

1
  1. プロシージャは、C/C++ の void 関数に相当します。
  2. Visual C++ では、thisポインターはecxレジスターで渡され、メンバー関数の既定の呼び出し規約は__stdcall、可変引数を渡した場合を除き、 に変わります__cdecl。呼び出し規約を除いて、コールバックは正しくある必要があります。
于 2013-05-15T13:04:12.560 に答える