外部函数
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 Int32commandLine$ 是一个字符串,用于存储以空格分隔的函数名和参数的命令行。
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+ 版本中始终可用。
- 外部程序执行 (等待结束,返回输出的第一行)
ret = CallExternal("Execute program [arg(s)]", output$) - 外部程序启动 (不等待结束)
ret = CallExternal("ExecuteNoWait program [arg(s)]", output$) - 获取与 CallExternal 结果代码对应的字符串
ret = CallExternal("ErrorStr Str$(retCode)" output$)- 例
Int32 ret String output$ ret = CallExternal("ErrorStr 0", ByRef output$) Print output$- 将在 Run 窗口输出 Success。
- 例
(高级用户向)
此外,桥接 DLL 中还包含用于控制外部函数行为的函数。(需要与 CallExternal 相同的 Declare 语句)
- GetTimeout(ByRef timeout As Int32) As Int32
- 获取 CallExternal 的超时时间。单位为毫秒,初始值为 30,000。
- SetTimeout(timeout As Int32) As Int32
- 设置 CallExternal 的超时时间。单位为毫秒。