DLL(動態鏈接庫)文件是Dynamic Link Library的縮寫形式,是一種允許程序共享執行特殊任務所必需的代碼和其他資源的可執行文件。其多數情況下是帶有DLL擴展名的文件,但也可能是EXE或其他擴展名。Windows提供的DLL文件中包含了允許基於Windows的程序在Windows環(huan)境(jing)下(xia)操(cao)作(zuo)的(de)許(xu)多(duo)函(han)數(shu)和(he)資(zi)源(yuan)。動(dong)態(tai)鏈(lian)接(jie)提(ti)供(gong)了(le)一(yi)種(zhong)方(fang)法(fa),使(shi)進(jin)程(cheng)可(ke)以(yi)調(tiao)用(yong)不(bu)屬(shu)於(yu)其(qi)可(ke)執(zhi)行(xing)代(dai)碼(ma)的(de)函(han)數(shu)。這(zhe)些(xie)函(han)數(shu)的(de)可(ke)執(zhi)行(xing)代(dai)碼(ma)位(wei)於(yu)一(yi)個(ge)DLL中,該DLL包含一個或多個已被編譯、鏈接並與使用它們的進程分開存儲的函數。DLL還有助於共享數據和資源,多個應用程序可同時訪問內存中單DLL副本的內容。總之,DLLshiyigebaohankeyouduogechengxutongshishiyongdedaimaheshujudeku。dongtailianjieshixiangduiyujingtailianjieeryande。suoweijingtailianjieshizhibayaotiaoyongdehanshuhuozheguochenglianjiedaokezhixingwenjianzhong,chengweikezhixingwenjiandeyibufen。huanjuhuashuo,hanshuheguochengdedaimajiuzaichengxudeexe文wen件jian中zhong,該gai文wen件jian包bao含han了le運yun行xing時shi所suo需xu的de全quan部bu代dai碼ma。當dang多duo個ge程cheng序xu都dou調tiao用yong相xiang同tong函han數shu時shi,內nei存cun中zhong就jiu會hui存cun在zai這zhe個ge函han數shu的de多duo個ge拷kao貝bei,這zhe樣yang就jiu浪lang費fei了le寶bao貴gui的de內nei存cun資zi源yuan。而er動dong態tai鏈lian接jie所suo調tiao用yong的de函han數shu代dai碼ma並bing沒mei有you被bei拷kao貝bei到dao應ying用yong程cheng序xu的de可ke執zhi行xing文wen件jian中zhong去qu,而er是shi僅jin僅jin在zai其qi中zhong加jia入ru了le所suo調tiao用yong函han數shu的de描miao述shu信xin息xi(往往是一些重定位信息)。僅當應用程序被裝入內存開始運行時,在Windows的管理下,才在應用程序與相應的DLL之間建立鏈接關係。當要執行所調用DLL中的函數時,根據鏈接產生的重定位信息,Windows才轉去執行DLL中相應的函數代碼。
LabVIEW 中是通過Call Library Function Node(CLN)節點來完成DLL文件調用的。創建一個新的VI,右擊程序框圖,在Functions Palette中依次選中Connectivity――Libraries&Executables工具欄即可找到該節點(圖1)。
LabVIEW與外部程序間DLL文件的調用
將節點放置在程序框圖中,雙擊會出現它的配置對話框,共有四頁。第一頁用於填寫被調用函數的信息(圖2)。Library name or path需給出DLL文件名和路徑,操作係統路徑下的DLL文件,直接輸入文件名也可調用,否則必須輸入全路徑。在這裏已經給出名字的DLL是被靜態加載到程序中的,也就是說當調用了這個DLL的VI被裝入內存時,DLL同時被裝入內存。LabVIEW也可動態加載DLL,隻要勾選上Specify path on diagram的選項即可。選擇了這個選項,在 Library name or path中輸入的內容就無效了,取而代之的是CLN 節點多出一對輸入輸出,用於指明所需要使用的DLL的路徑。這樣,當VI被打開時,DLL不會被裝入內存,隻用程序運行到需要使用這個DLL中的函數時,才把其裝入內存。Function name是需要調用的函數的名稱,LabVIEW會把DLL中所有的暴露出來的函數都列出,用戶隻要在下拉框中選取即可。Thread欄用於設定哪個線程裏運行被調用的函數。用戶可以通過 CLN 節點的配置麵板來指定被調用函數運行所在的線程。CLN 的線程選項非常簡單,隻有兩項: Run in UI thread和Run in any thread。LabVIEW的程序框圖上直接可以看出一個 CLN節點是選用
圖2 填寫被調用函數信息的什麼線程。如果Run in UI thread,節點顏色是橙色的;Run in any thread則是淺黃色的(圖3)。
圖3 CLN不同線程對比
通常情況下,除非使用的動態鏈接庫是多線程安全的,CLN 中選擇Run in any thread方式;否則必須選擇Run in UI thread方式。判斷一個動態鏈接庫是不是多線程安全的,需通過以下方法:如果一個動態鏈接庫的文檔中沒有明確說明它是多線程安全的,那麼就要當作是非多線程安全的;在可以看到動態鏈接庫源代碼的條件下,如果代碼中存在全局變量、靜態變量或者代碼中看不到有lock一類的操作,那麼這個動態鏈接庫也就肯定不是多線程安全的。
選擇了Run in any thread方式,LabVIEW會在最方便的線程內運行動態鏈接庫函數,且一般會與調用它的VI在同一個線程內運行。因為LabVIEW是自動多線程的語言,它也很可能會把動態鏈接庫函數分配給一個單獨的線程運行。如果程序中存在沒有直接或間接先後關係的兩個CLN節點,LabVIEWhenkenenghuitongshizaibutongdexianchengneiyunxingtamensuotiaoyongdehanshu,yexushitongyihanshu。duiyufeiduoxianchenganquandedongtailianjieku,zheshihenweixiandecaozuo。henrongyiyinqishujuhunluan,shenzhishichengxubengkui。
選擇Run in UI thread方式,因為LabVIEW隻有一個界麵線程,所以如果所有的CLN設置都是界麵線程,那麼就可以保證這些CLN調用的函數肯定全部都運行在同一線程下,肯定不會被同時調用。對於非多線程安全的動態鏈接庫,這種方式就保證了它的安全。