調用我的DLL為什么會導致LabVIEW崩潰?
硬件: PXI/CompactPCI>>Controllers
|
問題: 當我使用調用庫函數節點調用我的DLL時,LabVIEW崩潰了,會是由於什么原因?
解答: 有一些不同的可能原因會導致LabVIEW在調用dll函數的時候崩潰:
- 確認您選擇了和DLL相同的調用規范
使用C調用規范時,調用方負責清空堆棧。使用標准調用規范時,被調用函數負責清空堆棧。如果調用方 (LabVIEW) 和被調用的DLL 函數不使用相同的調用規范,那會出現:要么它們都將數據移出堆棧或者它們都不清空堆棧。任意一種情況會在被調用函數返回的時候導致 LabVIEW崩潰。調用規范在調用函數節點窗口的右下角設置,參見下圖。

- 確認您連接了調用函數節點的所有輸入輸出
如果您不連接輸入,DLL函數會覆蓋沒有被分配的內存。如果您不連接輸出,LabVIEW假定DLL函數不需要輸入端傳入的已分配內存空間,並把這些空間用於其他用途。然后,DLL函數會覆蓋被保留的LabVIEW內存空間,導致LabVIEW崩潰。 - 確認DLL函數沒有覆蓋LabVIEW內存
許多DLL函數需要使用由指針或者值傳遞的被分配的內存, 寫入這些內存並返回。如果沒有分配足夠的內存空間或者DLL寫入了比分配的大小更多的數據,DLL會覆蓋保留的LabVIEW內存空間並且導致LabVIEW崩潰。比如說,考慮如下函數:double *Waveform (double *waveform, uInt32 size);
在這個例子中,合適的分配內存的方法是用合適的維數大小參數初始化數組,而不是傳遞一個空的數組。下圖列舉了一個合適的方法。
- 確認LabVIEW使用了正確的數據類型像函數傳遞參數
在LabVIEW中使用不正確的參數數據類型(值,參考,句柄,等)調用DLL函數會導致函數意外的指向不正確的內存位置,從而導致數據錯誤,或者甚至導致LabVIEW或者Windows的崩潰。 - 如果您在LabVIEW中生成了DLL並且您想要顯示DLL VI的前面板,您必須遵照兩個必要條件。
- 調用函數節點必須被設置,使調用DLL可以在任何線程運行。這通過更改線程單選按鈕從在UI線程中運行至在任何線程中運行。
- 調用的VI不能在用戶界面線程中運行。這可以通過This can be checked by selecting從下拉菜單中選擇 文件»VI 屬性,在 類別列表中選擇執行,確認首選執行系統是標准,儀器I/O,數據采集,其他1或者其他2。不能選擇與調用方相同選項,因為這樣的話父VI可能運行在用戶界面線程下。
如果需要完整的關於在LabVIEW 7.1或更早版本上使用其他編程語言的文檔,請參考 Using External Code in LabVIEW 手冊 (下文附有鏈接)。在LabVIEW 8.0或者以后的版本上,參考LabVIEW幫助中內容列表,基礎»調用以文本編程語言編寫的代碼(下文附有鏈接)查找更多的信息。
- LabVIEW 直到關閉時才崩潰
最可能的問題是被調用的DLL函數破壞了內存空間。如果您向DLL傳遞數組和字符串,DLL函數不能動態更改數組大小。寫入超過數組或字符串最后一個元素可能會破壞內存,並且這個問題可能只有在LabVIEW被關閉后才會顯現出來。
- 函數可能自己The function call itself does something illegal
如果函數企圖做一些不合法的操作,它也會導致LabVIEW崩潰。如果您不是函數的編寫者,聯系編寫函數的程序員。