2

C ++に、メモリアドレスへのポインタを使用して呼び出す関数があるとしtypedefます。さて、Delphiで同じことをどのように行うことができますか?

例えば:

typedef void (*function_t)(char *format, ...);
function_t Function;
Function = (function_t)0x00477123;

そして、私はそれを次のように呼び出すことができます:Function("string", etc);

Delphiで、アセンブリ命令を使用せずにこれを行う方法はありますか?

可変個引数パラメータ関数であることに注意してください。

4

3 に答える 3

17

このための慣用的な翻訳:

typedef void (*function_t)(char *format, ...);
function_t Function;
Function = (function_t)0x00477123;

これは:

type
  TFunction = procedure(Format: PAnsiChar) cdecl varargs;
var
  Function: TFunction;
// ...
  Function := TFunction($00477123);

'cdecl varargs'は、C呼び出し規約(呼び出し元がスタックをポップする場所)と可変引数引数のサポート(C呼び出し規約でのみサポートされる)を取得するために必要です。Varargsは、Cを呼び出す手段としてのみサポートされています。Delphiには、可変個引数パラメータリストをCスタイルで実装するための組み込みサポートはありません。代わりに、Formatプロシージャとその仲間によって使用される別のメカニズムがあります。

function Format(const Fmt: string; const Args: array of const): string;

しかし、それについては他の場所でもっと知ることができます。

于 2010-01-27T22:15:36.583 に答える
2
program Project1;

type
  TFoo = procedure(S: String);

var
  F: TFoo;
begin
  F := TFoo($00477123);
  F('string');
end.

もちろん、上記を実行しただけでは、アドレス$00477123でランタイムエラー216が発生します。

于 2010-01-27T20:22:03.187 に答える
1

はい、Delphiは関数ポインタをサポートしています。次のように宣言します。

type MyProcType = procedure(value: string);

次に、タイプMyProcTypeの変数を宣言し、それにプロシージャのアドレスを割り当てます。これは、Cの場合と同じように呼び出すことができます。

スタンドアロンのプロシージャまたは関数ではなく、オブジェクトのメソッドへのポインタが必要な場合は、関数ポインタ宣言の最後に「ofobject」を追加します。

于 2010-01-27T20:21:43.880 に答える