在使用 Tpaxcompiler 的时候 希望导出纯种的2个函数为脚本所用。 但是不知道为什么总是调用出错。
function sx(strs: string):bool; overload;
function sx(tid: dword): BOOL; overload;function TThread_wk.sx(tname: string):bool;
begin
 form1.mmo1.Lines.Add('sx1');
end;function TThread_wk.sx(tid: dword): BOOL;
begin
 form1.mmo1.Lines.Add('sx2');
end;pxc.RegisterHeader(0,'function sx(tid:dword):BOOL; overload;',@TThread_wk.sx);
pxc.RegisterHeader(0,'function sx(tname:string):BOOL; overload;',@TThread_wk.sx);然后脚本调用: sx('TEST');
 程序输出: sx2 也就是他不去调用的
sx(tname: string): 而是 sx(tid: dword): 我感觉可能是 传指针 @TThread_wk.sx 的时候指针错误了。那么我如何得到 2个 sx 函数的指针呢。

解决方案 »

  1.   

    重载最终被编译器编译成两个函数,如你上面的函数,最终会编译成sx1、sx2,然后再把调用的地方都替换。
      

  2.   

    我传的变量是字符。应该是调用SX2的
    那么  这是 PAXCOMPILER 的BUG?  
      

  3.   

    楼主要理解脚本引擎运作的原理。你传进去的字符串,只是供脚本解释用的,实际干活的时候,PAX就要调用你传进去的函数了。然而你两次注册都是传的@TThread_wk.sx,我有个疑问,编译器能把@TThread_wk.sx先后变成两个地址么?
      

  4.   

    重载方法的获取稍微有些复杂,直接取地址肯定是不行的,必需利用类型匹配来由编译器完成,否则只能取到第一个的地址。program Project2;{$APPTYPE CONSOLE}uses
      SysUtils, Windows;type
      Tfoo  = class
      public
        function SX(X: string): BOOL; overload;
        function SX(X: DWORD): BOOL; overload;
      end;{ Tfoo }function Tfoo.SX(X: string): BOOL;
    begin
      Writeln('SX(X: string)');
      Result  := True;
    end;function Tfoo.SX(X: DWORD): BOOL;
    begin
      Writeln('SX(X: DWORD)');
      Result  := False;
    end;procedure ShowAddr;
    type
      TSXStr  = function (X: string): BOOL of object;
      TSXDW   = function (X: DWORD): BOOL of object;
      TCallee = procedure;
    var
      mtStr, mtDW : TMethod;
    begin
      with Tfoo(nil)do
      begin
        TSXStr(mtStr) := SX;
        TSXDW(mtDW) := SX;
      end;
      Writeln(Format('[%p]'#9'function Tfoo.SX(X: string): BOOL', [mtStr.Code]));
      Writeln(Format('[%p]'#9'function Tfoo.SX(X: DWORD): BOOL', [mtDW.Code]));
      TCallee(mtStr.Code)();
      TCallee(mtDW.Code)();
    end;begin
      ShowAddr;
      Readln;
    end.目前 d2009+ 是取不了 class procedure/function (...):T; overload; static; 的地址的,不知道这个 bug 在 d2011 中是否能得到修正。
      

  5.   

    如果利用 RTTI 或许能区别出来。