在Delphi中通过其内存地址调用可变参数C函数

时间:2010-01-27 20:07:24

标签: delphi typedef variadic-functions memory-address

假设我在C ++中有一个函数,我在其中使用指向其内存地址的指针调用它typedef。现在,我怎样才能在Delphi中做同样的事情?

例如:

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

然后,我可以用Function("string", etc);调用它。

有没有办法在不使用汇编指令的情况下在Delphi中执行此操作?

请注意,它是一个可变参数函数。

3 个答案:

答案 0 :(得分: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风格的可变参数列表。相反,有一种不同的机制,由格式程序和朋友使用:

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

但你可以在其他地方找到更多相关内容。

答案 1 :(得分:2)

program Project1;

type
  TFoo = procedure(S: String);

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

当然,如果您只运行上述内容,则会在地址$ 00477123处收到运行时错误216.

答案 2 :(得分:1)

是的,Delphi支持函数指针。声明如下:

type MyProcType = procedure(value: string);

然后声明一个MyProcType类型的变量并为其指定过程的地址,并且可以像在C中一样调用它。

如果需要指向对象方法的指针而不是独立的过程或函数,请在函数指针声明的末尾添加“ of object ”。