假设我有一个函数在C ++中,我把它用一个指向它的存储器地址,并typedef。现在,我该怎么做同样的事情在Delphi?

例如:

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

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

有没有办法做到这一点,而无需使用安装说明,在Delphi?

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

有帮助吗?

解决方案

这是惯用的翻译为这样:

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可变参数”是必需的以获得C调用约定(其中呼叫者弹出堆栈)和一个可变参数的支持(其仅与C调用约定支持)。可变参数仅支持作为用于调用C的装置;有没有内置支持德尔福在C风格实现可变参数的参数列表。取而代之的是一个不同的机构,通过在格式程序和朋友使用:

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

但你可以找到更多有关的其他地方。

其他提示

program Project1;

type
  TFoo = procedure(S: String);

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

当然,如果你只是执行上面的你会在地址$○○四七七一二三得到一个运行时错误216。

是,Delphi的支持函数指针。声明这样的:

type MyProcType = procedure(value: string);

然后声明类型MyProcType的变量,你的程序的地址分配给它,你可以调用它,你会以同样的方式下进行。

如果需要一个指针到一个对象,而不是一个独立的过程或功能的方法中,添加“的对象的”到函数指针声明的末尾。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top