我正在尝试使用超级对象调用类中的过程,但它不起作用,我在这里做错了什么?
代码示例:
program test_rpc;
{$IFDEF FPC}
{$MODE OBJFPC}{$H+}
{$ELSE}
{$APPTYPE CONSOLE}
{$ENDIF}
uses
SysUtils, superobject;
type
TCC = class(TObject)
published
procedure controler_method1(const This, Params: ISuperObject; var Result: ISuperObject);
end;
procedure TCC.controler_method1(const This, Params: ISuperObject; var Result: ISuperObject);
var
i: Integer;
begin
write('action called with params ');
writeln(Params.AsString);
end;
var
s: ISuperObject;
CC: TCC;
begin
CC := TCC.Create;
s := TSuperObject.Create;
s.M['controler.action1'] := CC.MethodAddress('controler_method1');
try
s['controler.action1("HHAHAH")'];
finally
s := nil;
writeln('Press enter ...');
readln;
end;
end.
会崩溃,我在这里做错了什么?
它实际上是“用Params调用的动作”,但未能显示参数......
答案 0 :(得分:2)
super方法的签名如下:
TSuperMethod = procedure(const This, Params: ISuperObject;
var Result: ISuperObject);
这意味着您无法使用实例方法,因为实例方法具有不兼容的签名。您的方法必须如下所示:
procedure sm(const This, Params: ISuperObject; var Result: ISuperObject);
begin
....
end;
您遇到运行时错误而不是编译时错误的原因是您使用@运算符放弃了类型系统。删除@并且您的程序将在编译时失败,并显示错误消息,该错误消息是我上面所述的更新版本。
这是Delphi编程的一个重要谬误,必须使用@运算符来获取函数指针。这是一个坏习惯,你会忘记忘掉。