調用動態連結程式庫中的原生函數

Epson RC+ 8.0可讓您調用動態連結程式庫(DLL)中的原生函數。

其係用於複雜的算術處理,並可調用外部裝置的原生函數。

若要調用原生DLL函數,請使用Declare聲明(此為SPEL+程式的函數定義命令),並依照正常方式撰寫函數調用。

有關詳細資訊,請參閲以下手冊。

「SPEL+ 語言參考 Declare」

調用原生DLL的範例

透過使用Microsoft Visual Studio 2019等開發工具,您可創建一個能從SPEL+調用的原生DLL。此處係以Visual Studio 2019為例,創建執行算術運算子的函數。

步驟1: 決定原生DLL的變數類型

您必須規劃在Epson RC+ 8.0中利用原生DLL進行轉換的資料類型。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++] - [Code]。

    3. 在中間的列表中選擇「Module-Definition File (.def)」。

    4. 在[Name: ]中,輸入檔案名稱。(此處將MyCalculator設為檔案名稱。)

    5. 點擊[Add]按鈕。

    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 "1*2=", Str$(result)
      calc$ = "div"
      result = MyArithmetic(1, 2, ByRef calc$);
      Print "1/2=", Str$(result)
    Fend
    
  3. 創建並執行專案。此時會顯示以下結果。

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

提示


在創建專案之前,務必將原生 DLL 成功複製到專案資料夾。若沒有成功,將會出現警告或錯誤。

如果使用第三方製作的DLL作爲原生DLL,請注意該DLL的依賴關係。如果依賴項的從屬DLL不在專案資料夾,或Windows環境變數PATH設置的資料夾中,則會發出警告或錯誤。