delphi - Variable required error (Delphi) - 如何获取程序的地址?
问题描述
在这里使用 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;
话虽如此,您不能将 aprocedure of object
用作 C/C++ 回调,除非 C/C++ 代码是专门用 C++Builder 编写的,并且实际上期望procedure of object
通过__closure
编译器扩展来实现 a。如果没有,您将无法使用非静态类方法作为回调。但是,如果回调允许您传入用户定义的值,则可以使用它来传入对象的Self
指针,以便回调可以访问其非静态成员。
此外,您TProcedureCallback
使用的是 Delphi 的默认register
调用约定(__fastcall
在 C++Builder 中),非 C++Builder 编译器中不存在该约定。只有cdecl
和stdcall
是可移植的调用约定。
推荐阅读
- git - `git config --global alias.past = log --pretty=format:"%h|%ad|%s" --date=local` 不起作用
- r - 使用 kable 根据值对一行元素进行着色
- pandas - 如何根据熊猫中的匹配条目将特定列值从一个数据帧复制到另一个数据帧
- awk - 如何从制表符分隔的文件创建 GMT 文件?
- triggers - 如何使用谷歌标签管理器在服务器端设置按钮点击?
- angular - 以角度扩展组件和视图
- cassandra - 'cassandra' 未被识别为内部或外部命令
- python - Pandas Merge ValueError:操作数无法与形状一起广播(323,)(324,)()
- influxdb - 包含子串的 InfluxdB 通量查询测量
- javascript - Chart.js 中具有线性时间刻度的折线图