如何使用LabVIEW提供Callback Function pointer到DLL中

更新 Aug 31, 2023

產品資訊

軟體

  • LabVIEW Base

問題敘述

我需要在LabVIEW中呼叫一個DLL,裡面有一個包含Callback Function指標(pointer)的函數原型(function prototype)。我想讓我的Callback Function pointer 指向記憶體中的VI。如何在LabVIEW中呼叫此DLL並傳遞 VI 的指標當作Callback Function 的參數?

解決方案

LabVIEW沒有辦法直接傳遞指向VI的指標到DLL中當作Callback function。但是,我們可以利用基於 C 語言的 wrapper 來當作替代方案。C wrapper可用來當作LabVIEW API和DLL參數間的介面。
  1. 在LabVIEW建立User Event並且註冊到Event Structure中,這個 event 會在User Event被觸發時執行原本預期 callback VI 的任務。
    • 在Labview 透過 Call Library Function Node VI 可讓Wrapper DLL獲得event refnum,然後實做一個method,(例如:myWrapperMethod)利用event refnum來呼叫C語言的函數PostLVUserEvent。
  2. myWrapperMethod內,PostLVUserEvent會收到兩個輸入參數,一個是ref (LabVIEW event refnum)另一個則是data(pointer to void),data可以是原始DLL任意資料型態輸出給VI callback Function。
    • 注意:可能需要將資料型態轉換(typecasting)或解析(parsing)wrapper layer中的data,此動作是為了讓DLL輸出的資料型態(data type)與LabVIEW相容。有關這方面的更多資訊,請參閱DLL的header file,因為這會根據不同的DLL而異。
  3. 在Wrapper的main函數中添加一行來呼叫原始DLL,並將指向wrapper method 的指標當作DLL的Callback Function parameter。
  4. 當原始DLL設定呼叫堆疊(call stack) pointer指向callback function 記憶體位置時,wrapper function(myWrapperMethod)將會被呼叫並且透過PostLVUserEvent觸發特定的user event。
    • 這將會執行與預期callback VI相關聯的event case,並透過data參數將相關數據傳回到LabVIEW。