外部函数

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 的超时时间。单位为毫秒。