2012-04-22 13 views
0

これはこの関数のC++ヘッダーです。私はそのコールバックを除いて既にすべてをインポートしました。私はそれを行う方法を知らない。以前の質問の知識に基づいてデルファイへのC++コールバック関数のインポート

struct abs_operation; 

typedef struct abs_operation ABS_OPERATION; /* forward declaration */ 

typedef void (BSAPI *ABS_CALLBACK) (const ABS_OPERATION*, ABS_DWORD, void*); 

struct abs_operation { 
     ABS_CALLBACK Callback; ///< Pointer to application-defined function, implementing operation callback. 
} ; 

答えて

1

、それはこのようなものだ、私は思う:

type 
    PABSOperation = ^TABSOperation; 
    TABSCallback = procedure(const Operation: PABSOperation; 
    Flags: DWORD; Ptr: Pointer); stdcall; 
    TABSOperation = record 
    Callback: TABSCallback; 
    end; 
+0

Delphiの宣言でのconstを使用する権利はありません。 C++では、constは変更できません。 (オペレーション:PBASOperation、...)または(constオペレーション:TABSOperaion ...) –

+0

@Stefano実際には、 'const'はRemyによる編集で追加されました。しかし、ここでは問題ありません。実際には 'const'を含めるかどうかは関係ありません。あなたは、デルファイの「const」は「ref by passed」を意味します。その声明は偽です。 'const'を使うと、パラメータの大きさがポインタの大きさより大きければ、refによるパスを誘導します。実際、これは64ビットに移植するときの非常に微妙なバグの原因です。サイズ8の 'record'を考えてみましょう。 32ビットで 'const R:TRecord'を渡し、refで渡します。そのように64ビットで渡し、値渡しされます。 –

+0

ありがとう、私はその微妙な違いを知らなかった。 D7でレコードサイズ<= 4バイトを使用し、レコード> 8を使用して(CPUビューを使用して)あなたのケースをテストしました。最初のケースでは、引数はAX(al、axまたはeaxの大きさに応じて)で渡されます。 2番目のケースでは、入力アドレスがEDXに渡されます。しかし、私の意見は同じです:Cの関数宣言を翻訳するときにconstパラメータを使用しないでください。あなたはコンパイラの実装とCPUアーキテクチャに依存します。 "struct abs_operation"に別のフィールドがあった場合は、32ビットの値と64ビットのデルファイのrefで渡されます。 –

関連する問題