调用动态链接库中的基本函数

Epson RC+ 8.0允许您调用动态链接库(DLL)中的基本函数。

这是用于复杂的运算处理并调用外部设备的基本函数。

若要调用本机DLL函数,使用Declare语句(这是SPEL+程序中的一个函数定义命令),并且将函数调用写作常规。

有关详细信息,请参阅以下手册。

《SPEL+语言参考 - Declare》

调用本机DLL的样本

通过开发工具如Microsoft Visual Studio 2019,您可以创建一个可从SPEL+中调用的本机DLL。在这里,它使用Visual Studio 2019作为样本来创建一个函数,执行运算符。

第1步:决定本机DLL的变量类型

您需要决定数据类型以使用本机DLL和Epson RC+ 8.0进行传输。Epson RC+ 8.0数据类型和C/C++变量类型的对应表如下所示。不能使用C/C++字节类型和结构,因为Epson RC+ 8.0没有其对应的数据。

Epson RC+ 8.0和C/C++数据对应表

Epson RC+ 8.0 C/C++
Boolean short
Byte short
Short short
Integer short
Long int
Real float
Double double
String char [256] * 包含Null

第2步:创建一个本机DLL

  1. 启动Visual Studio 2019。

    在开始菜单中选择[创建新项目]。

  2. 弹出[创建新项目]窗口。

    1. 在对话框右侧的列表中选择“Windows桌面向导”。

    2. 单击[下一步]按钮。

  3. 启动Windows桌面向导。

    1. 在[项目名称]中輸入项目名称。(此处输入“MyCalculator”)

    2. 单击[建立]按钮。

  4. 设置项目选项。

    1. 在[应用程序类型]中选择“动态链接库 (.dll)”。

    2. 勾选[其他选项:] 中的[导出符号]选项。

    3. 单击[确定]按钮。

  5. 在MyCalculator.cpp中自动生成函数fnMyCalculator的简单示例。添加函数MyArithmetic,对这个文件执行算术运算符。

    MYCALCULATOR_API float MyArithmetic(short value1, short value2, char * kind )
    {
      if ( !strcmp(kind, "add") )
      {
        return (float)(value1 + value2);
      }
      else if ( !strcmp(kind, "sub") )
      {
        return (float)(value1 - value2);
      }
      else if ( !strcmp(kind, "mul") )
      {
        return (float)(value1 * value2);
      }
      else if ( !strcmp(kind, "div") )
      {
        return (float)(value1) / (float)(value2);
      }
      else
      {
        strcat_s(kind, 10, " NG");
        return 0;
      }
    }
    
  6. 导出函数,使其能够从SPEL+中调用。

    1. 选择Visual Studio 2019菜单 - [项目] - [添加新项]。会出现[添加新项]对话框。

    2. 在对话框左侧列表中选择[Visual C++] - [代码] 。

    3. 在中间的模块列表中选择“模块定义文件 (.def)”。

    4. 在[名称:]中输入文件名。(此处将“MyCalculator.def” 设为文件名。)

    5. 单击[添加(A)]按钮。

    6. 将“fnMyCalculator函数”和“MyArithmetic函数”创建到“MyCalculator.def”文件中。

      LIBRARY "MyCalculator"
      EXPORTS
      fnMyCalculator
      MyArithmetic
      
  7. 生成项目,并创建DLL。选择[Win32]作为Visual Studio 2019的解决方案平台。然后从Visual Studio 2019菜单中选择[创建] - [Build MyCalculator]。如果没有报错,则DLL成功创建。

要点


Epson RC+ 8.0中无法使用64位版的本机DLL。并且,当使用由Visual Studio 2015之前版本创建的DLL时,必须事先单独安装与该版本相对应的运行时刻(runtime)。

第3步:从SPEL+中调用DLL函数

要点


从Epson RC+ 8.0中调用函数之前,您必须对其进行调试并彻底检查是否其运行正常。如果基本函数中发生错误(如系统错误),Epson RC+ 8.0将无法正常工作。

  1. 将创建的MyCalculator.dll复制到Epson RC+ 8.0项目文件夹(如,C:\EpsonRC80\projects\dllcall)。

  2. 定义一个在SPEL+程序中执行算术运算符的DLL函数且为Function main中的MyArithmetic写一个函数。

    Declare MyArithmetic, "MyCalculator.dll"(value1 As Integer, value2 As Integer, ByRef calc$ As String) As Real
    Function main
      Real result;
      String calc$
    
      calc$ = "add"
      result = MyArithmetic(1, 2, ByRef calc$);
      Print "1+2=", Str$(result)
      calc$ = "sub"
      result = MyArithmetic(1, 2, ByRef calc$);
      Print "1-2=", Str$(result)
      calc$ = "mul"
      result = MyArithmetic(1, 2, ByRef calc$);
      Print "12=", Str$(result)
      calc$ = "div"
      result = MyArithmetic(1, 2, ByRef calc$);
      Print "1/2=", Str$(result)
    Fend
    
  3. 创建和执行该项目。将显示以下结果。

    1+2=3
    1-2=-1
    12=2
    1/2=0.5
    

要点


创建该项目之前,一定要正确无误地将本机DLL复制到项目文件夹中。如果失败,将出现警告或错误。

当使用第三方DLL作为本机DLL时,请注意该DLL的依赖关系。如果作为依赖项的DLL程序不在项目文件夹,或Windows环境变量PATH设定的文件夹中时,则会发生警告或报错。