為什麼我在LabVIEW中呼叫DLL時,會突然終止執行?



主要軟體:
主要軟體版本: 7.1
主要軟體修正版本:
次要軟體: LabVIEW Development Systems>>LabVIEW Professional Development System, LabVIEW Development Systems>>LabVIEW Base Package

問題: 當我在LabVIEW中使用Call Lirary Function Node時,LabVIEW會突然終止執行?

解答: 有幾點原因會造成LabVIEW突然終止:
1. 請先確認您呼叫DLL的方式是否符合此DLL的使用方法。使用C的呼叫步驟,呼叫者只需要負責將堆疊記憶體清除即可。如果是使用標準呼叫步驟,呼叫的功能必須將堆疊記憶體中的資料清除。如果呼叫者(LabVIEW)不使用固定的呼叫步驟來呼叫功能(您所建立的DLL),那麼雙方都會做清除的動作,或者都不會。那麼就會在回傳DLL運算值時,造成您的LabVIEW突然終止。
2. 請確認您的DLL不會覆蓋到您LabVIEW執行的記憶體。當LabVIEW傳一個定址點給您的DLL時,就會預留部分的記憶體給您的定址點使用(例如矩陣,字串或者是叢集等。)而DLL標準的作法應該是將運算值寫入此記憶體中,並且LabVIEW可以從此記憶體中讀取回傳值(也就是您在Call Library Function Node右邊的設定)。通常DLL會有一個參數是回傳記憶體(矩陣或其他結構)的大小,那麼就可以知道所使用的記憶體大小。如果被指定不足的記憶體,或者是此DLL所寫入的值超過記憶體所指定的大小,那麼就會發生覆寫LabVIEW記憶體的錯誤,並且造成LabVIEW主程式突然終止。
3. 請確認您所傳入DLL的參數資料格式符合您DLL的設定。如果您的DLL或LabVIEW不承認您所輸入的參數(例如value, reference, handle等),那麼就會造成您的DLL非預期地隨機指定記憶體中的位置。如此缺陷的參數便會造成LabVIEW或Windows突然終止。
4. 請確認您的Call Library Function Node的右邊輸出點,是否有對應到您DLL所寫入記憶體的參數而連接傳輸線。如果右邊的資料輸出接點沒有連線,LabVIEW便會假設您的DLL不需要或者將記憶體指給其他的物件使用。您的DLL便會發生覆寫LabVIEW所預留記憶體的動作,進而造成您的LabVIEW突然終止。

相關連結:

KnowledgeBase 228AA3IJ: Why Does LabVIEW Crash When Calling My LabVIEW DLL?
KnowledgeBase 3OUJ9U4B: When Does The DLL Specified By A Call Library Function Node Get Loaded Into Memory?
Using External Code in LabVIEW

附加檔案:





報告日期: 04/08/2005
最後更新: 10/02/2009
文件偏號: 3K7FBKDW