delphi - 为什么这个过程不是 TProc?
问题描述
我有如下情况:
interface
type
IMyInterface = interface
[GUID]
procedure MyProcedure; stdcall;
end;
TMyOBject = class(TInterfacedObject, IMyInterface)
procedure MyProcedure; virtual; stdcall; abstract;
end;
TDerivedObject = class(TMyOBject)
procedure MyProcedure; override; stdcall;
procedure SomeOtherProcedure;
end;
implementation
uses
System.Threading;
procedure TDerivedObject.MyProcedure;
begin
//DoStuff;
end;
procedure TDerivedObject.SomeOtherProcedure;
begin
TTask.Run(MyProcedure); //Error: Run can't be called with this parameter
end;
编译器说我不能使用 TTask 来运行 MyProcedure。尝试将 MyProcedure 转换为 TProc 是错误的。我的问题是 1) MyProcedure 是什么类型?2) 我将如何去发现 MyProcedure 的类型?
谢谢
解决方案
TProc
不使用stdcall
调用约定。它被声明为使用默认register
调用约定的匿名方法类型:
TProc = reference to procedure;
然而
TMyProcedure = procedure of object; stdcall;
匿名方法与声明调用约定而不是标准 Delphi 约定的方法不兼容register
。要么不使用stdcall
,要么插入包装方法或本地匿名方法,即:
procedure TDerivedObject.SomeOtherProcedure;
begin
TTask.Run(procedure begin MyProcedure; end);
end;
推荐阅读
- java - Tomcat 服务器声明我的 PostgreSQL 数据库不存在,但它确实存在
- python - 变量没有按应有的方式更新
- python - 分配前引用的局部变量“数据” - python
- c++ - 回文程序和条件跳转或移动取决于未初始化的值
- java - 如何测试这条骆驼路线?依赖注入和环境变量
- github - 如何将新文件/文件夹添加到现有的 Github 存储库?
- java - Android:错误:-source 1.3 中不支持注释
- javascript - 页面加载后如何正确运行JS
- tomcat9 - Catalina-utility-1 和 Catalina-utility-2 内存分配过多
- react-native - 照片库中未列出将远程图像下载到本地设备