2012-04-17 96 views
7

我爲我的應用程序編寫了一個腳本語言,我的目標是使在腳本中發佈任何類型的delphi成爲可能。我使用rtti來自動完成這項任務。對於像類的任何實例類型,我使用以下代碼從腳本中查找和調​​用方法。德爾福 - 每個名稱的調用記錄方法

var Info : TRttiType; 
    Meth : TRttiMethod; 
    Param : TArray<TValue>; 
    Result : TValue; 
    AnyClass : TClass; 
begin 
    ... 
    Info := RttiContext.GetType(AnyClass); 
    Meth := Info.GetMethod('AMethod'); 
    Setlength(Param, 1); 
    Param[0] := TValue.From<Integer>(11); 
    Result := Meth.Invoke(ClassInstance, Param); 
    ... 
end; 

但隨着創紀錄的代碼不起作用,因爲TRttiMethod型不提供記錄類型的invoke()方法。我可以通過Info.GetMethod('AMethod')從記錄類型訪問方法信息。
例如,我有這樣的記載:

TRecordType = record 
    Field1, Field2 : single; 
    procedure Calc(Value : integer); 
end; 

因此,沒有人知道一種從記錄調用一個方法,如果我有方法名或methodaddress?

+0

您剛剛重新創建[DWScript](http://code.google.com/p/dwscript/)嗎? – 2012-04-17 13:55:26

+0

感謝您的提示,但我知道DWScript。我的語言是作爲一個delphi程序的腳本接口,其結構像AObject.AFunction.AObject.DoSomething是可能的。 – DragonFlyOfGold 2012-04-17 14:05:19

+2

我認爲DWScript可以做到這一切,但也許我錯了 – 2012-04-17 14:15:19

回答

12

在瀏覽上面評論中發佈的delphi文檔中的鏈接後,我仔細查看了System.Rtti中的delphi類型TRttiRecordMethod。它提供DispatchInvoke()方法,並且此方法需要一個指針。 所以,下面的代碼工作:

TRecordType = record 
    Field1, Field2 : single; 
    procedure Calc(Value : integer);  
end; 


    Meth : TRttiMethod; 
    Para : TRttiParameter; 
    Param : TArray<TValue>; 
    ARec : TRecordType; 
begin 
    Info := RttiContext.GetType(TypeInfo(TRecordType)); 
    Meth := Info.GetMethod('Calc'); 
    Setlength(Param, 1); 
    Param[0] := TValue.From<Integer>(12); 
    Meth.Invoke(TValue.From<Pointer>(@ARec), Param); 
end; 

如果你想調用靜態方法或重載運算符的代碼不起作用。 Delphi內部始終將自指針添加到參數列表,但這會導致訪問違規。因此,請改用此代碼:

Meth : TRttiMethod; 
    Para : TRttiParameter; 
    Param : TArray<TValue>; 
    ARec : TRecordType; 
begin 
    Info := RttiContext.GetType(TypeInfo(TRecordType)); 
    Meth := Info.GetMethod('&op_Addition'); 
    ... 
    Meth.Invoke(TValue.From<Pointer>(@ARec), Param); 
    Result := System.Rtti.Invoke(Meth.CodeAddress, Param, Meth.CallingConvention, Meth.ReturnType.Handle, Meth.IsStatic); 
end;  
+0

謝謝,這真的幫助我尋求一種動態調用SOAP Web服務的方法! – dahook 2012-06-28 22:57:10