gpt4 book ai didi

delphi - 所需的变量错误(Delphi)-如何获取过程的地址?

转载 作者:行者123 更新时间:2023-12-03 18:29:49 25 4
gpt4 key购买 nike

在这里使用Delphi 7。当我获取过程的地址(目的是将此方法的地址发送给外部C ++ DLL作为回调)时,Delphi 7编译器将报告Variable required。为什么?如何获取带有或不带有参数列表的方法的地址?

这是我的简化代码,显示了编译器错误。

// ...

type
PTProcedureCallback = ^TProcedureCallback;
TProcedureCallback = procedure() of object;

// ...

TTestCallback = class
constructor Create();
procedure MyCallback();
end;

//...

implementation
constructor TTestCallback.Create();
var
pCallback: PTProcedureCallback;
begin
// Constructor
inherited;

// Test callback
pCallback := @MyCallback; // <- [Error] Variable required
end;

procedure TTestCallback.MyCallback();
begin
// Do something
end;
end;

最佳答案

您根本不需要PTProcedureCallback,因为TProcedureCallback已经是指针类型。

constructor TTestCallback.Create();
var
pCallback: TProcedureCallback;
begin
// Constructor
inherited;
// Test callback
pCallback := MyCallback;
end;


话虽如此,您不能将 procedure of object用作C / C ++回调,除非C / C ++代码是专门用C ++ Builder编写的,并且实际上期望通过 procedure of object编译器扩展来使用 __closure 。否则,您将无法使用非静态类方法作为回调。但是,如果回调函数允许您传递用户定义的值,则可以使用该值传递对象的 Self指针,以便回调函数可以访问其非静态成员。

另外,您的 TProcedureCallback使用的是Delphi的默认 register调用约定(在C ++ Builder中为 __fastcall),在非C ++ Builder编译器中不存在。只有 cdeclstdcall是可移植的调用约定。

关于delphi - 所需的变量错误(Delphi)-如何获取过程的地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56778136/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com