外部函式

SPEL+ 程式可透過 Declare 陳述式,執行於 DLL 中定義的外部函式。此機制自舊版 RC+ 即已存在,且 DLL 必須為 32 位元原生格式。

在 Extension 開發套件中,提供了橋接 DLL,使 SPEL+ 程式能夠呼叫作為 64 位元組件的 Extension 內部函式。這就是 Extension 的「外部函式」擴展點。

呼叫此「外部函式」的格式如下所示。

  • 請於 SPEL+ 程式中插入以下 Declare 陳述式。

    Declare CallExternal, "C:\EpsonRC80\ExternalFunctionBridge.dll", "CallExternal",(commandLine$ As String, ByRef output$ As String) As Int32
    
    • commandLine$:儲存以空格分隔函式名稱與參數的命令列字串

    • output$:用於儲存函式輸出的字串變數

    • 傳回值為函式執行的結果碼

      • 0 表示正常結束(成功)
      • 非 0 表示錯誤
    • (範例)

      Int32 ret
      String output$
      ret = CallExternal("CubeRoot 10.0", ByRef output$)
      Print output$
      
      • 於 Run 視窗中會輸出 2.154434690031884。

若要使用此擴展點,需實作並匯出委派 RCXExternalFunction,並將函式名稱作為中繼資料一併匯出。

[Export(typeof(RCXExternalFunction))]
[ExportMetadata("Name", "CubeRoot")]
public RCXExternalFunction CubeRoot = (command, parameters) =>
{
    if (parameters.Count == 0 || !double.TryParse(parameters[0], out var input))
    {
        return ValueTuple.Create(RCXResult.BadArgument, string.Empty);
    }

    double output = Math.Cbrt(input);

    return ValueTuple.Create(RCXResult.Success, output.ToString());
};

透過此擴展點,可讓 SPEL+ 程式呼叫 Extension 中可實作的各種函式。

此外,下列為內建「外部函式」,於支援 Extension 的 RC+ 版本中皆可使用。

  1. 外部程式執行(等待結束並傳回輸出第一行)
    ret = CallExternal("Execute program [arg(s)]", output$)
    
  2. 外部程式啟動(不等待結束)
    ret = CallExternal("ExecuteNoWait program [arg(s)]", output$)
    
  3. 取得對應 CallExternal 結果碼的字串
    ret = CallExternal("ErrorStr Str$(retCode)" output$)
    
    • Int32 ret
      String output$
      ret = CallExternal("ErrorStr 0", ByRef output$)
      Print output$
      
      • 於 Run 視窗中會輸出 Success。

(進階用戶適用)

此外,橋接 DLL 亦提供用於控制外部函式行為的函式。(同樣需要與 CallExternal 相同的 Declare 陳述式)

  1. GetTimeout(ByRef timeout As Int32) As Int32
    • 取得 CallExternal 的逾時時間。單位為毫秒,預設值為 30,000。
  2. SetTimeout(timeout As Int32) As Int32
    • 設定 CallExternal 的逾時時間。單位為毫秒。