2

DLLを使用するために、Cヘッダーファイルのみを使用できます。現在、これらのヘッダーファイルをDelphiインターフェイスファイルに変換しています。これは、次のような複雑なCTypedefが発生するまでは非常にうまく機能します。

  typedef struct _IFSDK_PAUSE
  {
    int version;
    FPDF_BOOL (*NeedToPauseNow) (struct _IFSDK_PAUSE* pThis);
    void*       user;
  } IFSDK_PAUSE;

これは次のように変換されます。

type
  IFSDK_PAUSE = record

    version: Integer;

    pThis: <----- Problem!!!

    user: Pointer;
  end

これらの複雑なTypedefを正しく変換するにはどうすればよいですか?

4

1 に答える 1

7

これは関数ポインタです。構造体へのポインタを受け取り、を返しますFPDF_BOOL。おそらく、呼び出し規約が指定されていないため、デフォルトの呼び出し規約がcdecl適用されます。

その情報を使用して、次のようにDelphiに翻訳します。

type
  PIFSDK_PAUSE = ^IFSDK_PAUSE;
  TNeedToPauseNow = function(pThis: PIFSDK_PAUSE): FPDF_BOOL; cdecl;
  IFSDK_PAUSE = record
    version: Integer;
    NeedToPauseNow: TNeedToPauseNow;
    user: Pointer;
  end;

Cとは異なり、Delphi手続き型は暗黙的にポインタであることに注意してください。

于 2013-01-03T10:05:08.600 に答える