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個geDLL中,該DLL包含一個或多個已被編譯、鏈接並與使用它們的進程分開存儲的函數。DLL還有助於共享數據和資源,多個應用程序可同時訪問內存中單DLL副本的內容。總之,DLL是shi一yi個ge包bao含han可ke由you多duo個ge程cheng序xu同tong時shi使shi用yong的de代dai碼ma和he數shu據ju的de庫ku。動dong態tai鏈lian接jie是shi相xiang對dui於yu靜jing態tai鏈lian接jie而er言yan的de。所suo謂wei靜jing態tai鏈lian接jie是shi指zhi把ba要yao調tiao用yong的de函han數shu或huo者zhe過guo程cheng鏈lian接jie到dao可ke執zhi行xing文wen件jian中zhong,成cheng為wei可ke執zhi行xing文wen件jian的de一yi部bu分fen。換huan句ju話hua說shuo,函han數shu和he過guo程cheng的de代dai碼ma就jiu在zai程cheng序xu的deexe文(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節點,LabVIEW很hen可ke能neng會hui同tong時shi在zai不bu同tong的de線xian程cheng內nei運yun行xing它ta們men所suo調tiao用yong的de函han數shu,也ye許xu是shi同tong一yi函han數shu。對dui於yu非fei多duo線xian程cheng安an全quan的de動dong態tai鏈lian接jie庫ku,這zhe是shi很hen危wei險xian的de操cao作zuo。很hen容rong易yi引yin起qi數shu據ju混hun亂luan,甚shen至zhi是shi程cheng序xu崩beng潰kui。
選擇Run in UI thread方式,因為LabVIEW隻有一個界麵線程,所以如果所有的CLN設置都是界麵線程,那麼就可以保證這些CLN調用的函數肯定全部都運行在同一線程下,肯定不會被同時調用。對於非多線程安全的動態鏈接庫,這種方式就保證了它的安全。