首页 > 解决方案 > 为什么这个过程不是 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 的类型?

谢谢

标签: delphi

解决方案


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;

推荐阅读