我要如何使用 LabVIEW 來呼叫動態連接函式庫 (Dynamic Link Library DLL)?

更新 Dec 18, 2018

產品資訊

Software

  • LabVIEW

Programming Language

  • C
  • C++
  • C# .NET

問題敘述

我有用 C/C++ 撰寫程式 / API,我希望能夠在 LabVIEW 中呼叫。若我建立了動態連接函式庫(DLL),該如何從 LabVIEW 呼叫 DLL?

解決方案

如要在 LabVIEW 底下呼叫 DLL,您必須先了解它的型態是什麼。 基本上 DLL 會有兩種型態;C/C++ DLL 和 Microsoft .NET Assembly。 製造 C/C++ 型態的 DLL 可用 C, C++ 或其他語言 (.NET 語言除外) 像是 Java, Fortran 或 Visual Basic 6.0。 .NET 的 DLL 可被稱為 .NET Assembly 或 Assembly。.NET 的 DLL 與其它的 DLL 不太一樣。 .NET DLL 使用的是 Common Language Runtime (CLR) 和 .NET Framework 來管理 DLL 內的功能。


如果使用的是 C/C++ 的 DLL
  1. 找到它的標頭檔 (*.h) 或它的函數原型定義。
  2. 決定您想要使用的函數。請注意這些函數的參數是否是最基本的型態像是 int, char, double 或者是比較複雜的型態像是 struct, array 或 vector。
  3. 如果您的函數沒有任何複雜的參數而且您也有它的標頭檔(*.h), 那您就可以使用 Import Shared Library Wizard 來建立包含標頭檔中的函數的 LabVIEW library。此工具可在 Tool»Import»Shared Library (.dll)... 開啟。
  1. 如果您沒有 DLL 的標頭檔,您就必須研究此DLL的文件來了解函數裡參數的定義。接著,您就可以使用 Call Library Function Node 功能來呼叫您的函數。下圖顯示出 Call Library Function Node 在 palette 中的位置
  1. 雙擊 Call Library Function Node 來設定節點。在設定對話視窗的 Function 分頁,輸入 DLL 的路徑並選擇要呼叫的函式。
  1. 如果您要呼叫的函數包含複雜數據類型,則您必須在 Call Library Function Node 的設定視窗中手動定義函數原型 (如果 DLL 已使用型別程式庫 (Type Library) 編譯,參數和回傳類型將會被自動定義)。切換到設定視窗中的 Parameters 頁面。您可以在此添加參數以及修改回傳類型,直到視窗底部的函數原型與 DLL 的函數定義匹配。

如果使用的是 .NET assembly 的 DLL
  1. 要在 LabVIEW 中使用 .NET assembly,只需使用 .NET palette (Connectivity».NET) 即可找到所有可用的功能。
  2. 首先使用 Constructor Node 來實例一個 .NET assembly 類別。這可以通過雙擊 Constructor Node 以顯示 Select .NET Constructor 對話框來完成。
  1. 接著使用屬性與方法節點 (Property / Invoke Node) 來控制或呼叫此類別下的屬性與動作。您只需要把 Constructor node 的參考點連接到屬性或方法節點 (Property / Invoke Node) 即可。

相關資訊

如果您的複雜函數型態是具有多個基本數據類型 (int, double, char) 的結構,最簡單的方式就是製造一個基於 C 語言的 wrapper DLL。 由於 C / C++ 參數不一定跟 LabVIEW 的參數對的上,wrapper DLL 可以把複雜的參數轉換成比較基本的參數。例如,您有一個 C 寫的 struct 裡面包著一個 char * (文字或文字陣列) 的參數, 那您可以製造一個包裝檔來讓 LabVIEW 直接吃進 char * 並把它放進一個 struct 裡,最後再來呼叫原本的 DLL。所以在 LabVIEW 中您可以改為呼叫 wrapper DLL。如果您有此 DLL 的原始程式碼, 您也可以直接把 struct 型態改成 char* 的型態.

LabVIEW example finder 有如何在 LabVIEW 中正確呼叫外部程式碼的完整功能範例。請參閱 Help»Find Examples»Communicating with External Applications

本文是否有幫助?

無幫助