解決方案
LabVIEW沒有辦法直接傳遞指向VI的指標到DLL中當作Callback function。但是,我們可以利用基於 C 語言的 wrapper 來當作替代方案。C wrapper可用來當作LabVIEW API和DLL參數間的介面。
- 在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。
- 在
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而異。
- 在Wrapper的main函數中添加一行來呼叫原始DLL,並將指向wrapper method 的指標當作DLL的Callback Function parameter。
- 當原始DLL設定呼叫堆疊(call stack) pointer指向callback function 記憶體位置時,wrapper function(
myWrapperMethod)
將會被呼叫並且透過PostLVUserEvent觸發特定的user event。
- 這將會執行與預期callback VI相關聯的event case,並透過data參數將相關數據傳回到LabVIEW。