假设我在C ++中有一个函数,我在其中使用指向其内存地址的指针调用它typedef
。现在,我怎样才能在Delphi中做同样的事情?
例如:
typedef void (*function_t)(char *format, ...);
function_t Function;
Function = (function_t)0x00477123;
然后,我可以用Function("string", etc);
调用它。
有没有办法在不使用汇编指令的情况下在Delphi中执行此操作?
请注意,它是一个可变参数函数。
答案 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 ”。