技術(shù)頻道

娓娓工業(yè)
您現(xiàn)在的位置: 中國(guó)傳動(dòng)網(wǎng) > 技術(shù)頻道 > 應(yīng)用方案 > VC++和基于Lab Windows/CVI的DLL在測(cè)控技術(shù)中的應(yīng)用

VC++和基于Lab Windows/CVI的DLL在測(cè)控技術(shù)中的應(yīng)用

時(shí)間:2008-08-20 11:00:00來(lái)源:ronggang

導(dǎo)語(yǔ):?介紹了動(dòng)態(tài)鏈接庫(kù)(DLL)的運(yùn)行機(jī)制,闡述了基于Lab Windows/CVI的DLL的開發(fā)以及它和VC++程序的集成方法,對(duì)于兩種程序之間的通訊,給出了一種基于內(nèi)存映射的實(shí)現(xiàn)方法
摘 要:介紹了動(dòng)態(tài)鏈接庫(kù)(DLL)的運(yùn)行機(jī)制,闡述了基于Lab Windows/CVI的DLL的開發(fā)以及它和VC++程序的集成方法,對(duì)于兩種程序之間的通訊,給出了一種基于內(nèi)存映射的實(shí)現(xiàn)方法。文章最后給出了一個(gè)技術(shù)上具體實(shí)現(xiàn)的例子加以說(shuō)明。 關(guān)鍵詞: 虛擬儀器;Lab Windows/CVI;DLL;內(nèi)存映射 1、引言   大型測(cè)控系統(tǒng)的軟件系統(tǒng)通常采用高級(jí)語(yǔ)言結(jié)合專用測(cè)控軟件來(lái)開發(fā)。如何將不同的軟件程序加以集成,以及如何在它們之間進(jìn)行通訊是必須解決的問(wèn)題。   虛擬儀器測(cè)控系統(tǒng)中關(guān)鍵工作就是對(duì)數(shù)據(jù)的采集、分析、處理并模擬真實(shí)儀器面板的功能。由于VC++等高級(jí)語(yǔ)言的非針對(duì)性,采用其實(shí)現(xiàn)起來(lái)不僅復(fù)雜(如創(chuàng)建儀器面板,數(shù)據(jù)分析等),而且有些功能無(wú)法實(shí)現(xiàn),源代碼效率也較低;若采用Lab Windows/CVI,不僅開發(fā)方便,而且直觀,有些開發(fā)工作只需幾行代碼即可完成,可以大大提高系統(tǒng)開發(fā)的效率,節(jié)約時(shí)間。在筆者所參與的測(cè)控系統(tǒng)的開發(fā)中,采用的是用VC++開發(fā)系統(tǒng)軟件主干程序,負(fù)責(zé)系統(tǒng)軟件各方面的調(diào)度、管理,采用Lab Windows/CVI開發(fā)具體的測(cè)控功能,以具有不同功能的DLL形式組成測(cè)試功能模塊庫(kù),集成到主干程序中實(shí)現(xiàn)各種不同的測(cè)控功能,采用內(nèi)存映射實(shí)現(xiàn)兩種程序間通訊和數(shù)據(jù)傳輸。 2、Lab Windows/CVI中DLL的開發(fā)   2.1 Lab Windows/CVI中DLL的開發(fā)方式及其運(yùn)行機(jī)制   在CVI環(huán)境下,開發(fā)用于測(cè)控領(lǐng)域的動(dòng)態(tài)鏈接庫(kù),需將編譯目標(biāo)文件類型設(shè)置為DLL,并設(shè)置DLL名稱、存儲(chǔ)路徑、DLL函數(shù)/變量導(dǎo)出方式等,才能通過(guò)Create Debuggable Dynamic Link Library生成DLL工程。   DLL不是可執(zhí)行文件,它需要由應(yīng)用程和另外的DLL調(diào)用執(zhí)行。一個(gè)程序使用DLL,它只能通過(guò)這個(gè)DLL的導(dǎo)出函數(shù)/變量訪問(wèn)其內(nèi)部。在Lab Windows/CVI下創(chuàng)建DLL,有兩種方式導(dǎo)出函數(shù)/變量:頭文件法和導(dǎo)出關(guān)鍵字法。頭文件法使用頭文件確定要輸出的標(biāo)號(hào),頭文件中必須包含要導(dǎo)出標(biāo)號(hào)的聲明;導(dǎo)出關(guān)鍵字法把每一個(gè)要導(dǎo)出的函數(shù)和變量都標(biāo)記一個(gè)關(guān)鍵字,如__cdecl、__stdcall等,根據(jù)不同的編譯器使用不同的導(dǎo)出關(guān)鍵字。在DLL中只有被導(dǎo)出的函數(shù)/變量才能被外界所使用,所以只有指定DLL的導(dǎo)出函數(shù)/變量,該DLL才具有實(shí)際的使用意義。   DLL被調(diào)用時(shí),它有自己的運(yùn)行機(jī)制:每一個(gè)DLL都有一個(gè)DLLMain主函數(shù),在進(jìn)入和退出DLL時(shí),應(yīng)用程序分別調(diào)用這個(gè)函數(shù),它常常被用來(lái)執(zhí)行進(jìn)程的初始化和清理工作。因?yàn)樵谠摵瘮?shù)中定義了兩個(gè)事件句柄——DLL_PROCESS_ATTACH和DLL_PROCESS_DETACH。當(dāng)一個(gè)DLL被調(diào)用,即它被首次映射到進(jìn)程的地址空間時(shí),系統(tǒng)觸發(fā)DLL_PROCESS_ATTACH事件,一般在這部分執(zhí)行特定進(jìn)程的DLL初始化工作,如調(diào)用InitCVIRTE()函數(shù)初始化引擎等;當(dāng)應(yīng)用程序結(jié)束DLL的調(diào)用時(shí),系統(tǒng)觸發(fā)DLL_PROCESS_DETACH事件,一般在這部分進(jìn)行退出DLL時(shí)前的資源清理工作,如調(diào)用CloseCVIRTE ()釋放被DLL所占用的內(nèi)存。另外,CVI還提供了一個(gè)RunStateCallback()函數(shù)來(lái)對(duì)程序的執(zhí)行情況進(jìn)行記錄,使用時(shí)通過(guò)該函數(shù)也可以控制程序的執(zhí)行及系統(tǒng)資源分配。   2.2工程中DLL的開發(fā)   筆者所參與的測(cè)控系統(tǒng)的開發(fā)中, DLL開發(fā)采用的是另外一種方式,由于DLL本身的不可執(zhí)行性,調(diào)試上沒(méi)有可執(zhí)行文件方便,而且工程上需要在導(dǎo)出的DLL中包含虛擬儀器軟面板,且保持軟面板對(duì)虛擬儀器的控制性,因此,在實(shí)際的開發(fā)中,先編寫CVI用于實(shí)現(xiàn)具體測(cè)控功能的可執(zhí)行文件,調(diào)試成功后,把該可執(zhí)行文件改成具有相同功能的DLL。改編時(shí),僅僅對(duì)源文件(.c文件)的main函數(shù)做一些改變,并在頭文件(.h文件)中輸出,而無(wú)需做多的改變即可導(dǎo)出儀器軟面板,這樣在VC++主干程序調(diào)用該DLL時(shí)就可以方便的進(jìn)行測(cè)控工作。   具體操作上:  ?。?)首先編寫滿足測(cè)控要求的CVI的可執(zhí)行文件并調(diào)試成功;  ?。?)在工程文件中打開包含工程主函數(shù)main()的.c文件,向文件中插入DLL所必須的DLLMain函數(shù)。  ?。?)改寫.c文件中的main函數(shù)。修改其函數(shù)名及參數(shù),將其參數(shù)改為Windows的實(shí)例句柄HINSTANCE,它指向DLL被調(diào)用時(shí)DLL被映射到的進(jìn)程的地址空間。另外由于調(diào)用時(shí)要使用儀器軟面板,就必須導(dǎo)出相應(yīng)的.uir函數(shù),因此main中的編譯環(huán)境默認(rèn)的Loadpanel函數(shù)要用LoadpanelEx替代,因?yàn)槭褂肔oadpanel函數(shù)時(shí),用戶界面庫(kù)無(wú)法找到在.uir文件中定義的但沒(méi)有被DLL輸出的那些回調(diào)函數(shù),從而使DLL在被調(diào)用時(shí)出錯(cuò)。對(duì)于LoadpanelEx,因?yàn)槭褂肅VI編寫DLL時(shí),CVI自動(dòng)在工程中生成一個(gè).uir中的回調(diào)函數(shù)列表,DLL被調(diào)用時(shí),LoadpanelEx首先在此列表中進(jìn)行查找,它可以實(shí)現(xiàn)回調(diào)函數(shù)的導(dǎo)出,從而保證在DLL中軟面板對(duì)虛擬儀器的正??刂啤?  ?。?)將修改后的main函數(shù)的聲明加入到原工程的頭文件。   (5)選擇頭文件導(dǎo)出法,編譯成DLL文件。   經(jīng)過(guò)改編后原工程就變成了可以由VC++主干程序調(diào)用的DLL,而它的所有測(cè)試功能都沒(méi)有變。事實(shí)證明,因?yàn)檫@種創(chuàng)建DLL的方法不需要增加額外的程序進(jìn)行代碼調(diào)試,它比一般的直接創(chuàng)建方法要有效的多。 3 VC++應(yīng)用程序?qū)LL的調(diào)用   3.1 VC程序調(diào)用DLL的兩種方式   VC中鏈接DLL到應(yīng)用程序中有兩種方式:隱式鏈接和顯式鏈接。隱式鏈接時(shí),使用DLL的可執(zhí)行程序鏈接到DLL導(dǎo)入庫(kù)(.lib文件)中,導(dǎo)入庫(kù)中包含了DLL中的每個(gè)導(dǎo)出符合和序號(hào)。當(dāng)加載使用DLL的可執(zhí)行程序時(shí),操作系統(tǒng)同時(shí)加載DLL。為了隱式鏈接DLL,可執(zhí)行程序需要從DLL提供者獲取以下內(nèi)容:包含導(dǎo)出函數(shù)聲明的頭文件(.h),導(dǎo)入庫(kù)(.lib)文件和實(shí)際的DLL(.dll)文件。顯示鏈接時(shí),使用DLL的可執(zhí)行程序在運(yùn)行時(shí)通過(guò)函數(shù)調(diào)用來(lái)顯式加載或卸載DLL,并通過(guò)函數(shù)指針來(lái)調(diào)用DLL的導(dǎo)出函數(shù),應(yīng)用程序通過(guò)Loadlibrary函數(shù)來(lái)加載DLL并獲取模塊句柄;通過(guò)GetProcessAddress來(lái)獲取應(yīng)用程序要調(diào)用的導(dǎo)出函數(shù)的指針。   工程中筆者采用的是顯式鏈接方式調(diào)用DLL,與隱式鏈接相比,顯示鏈接較靈活,在這種方式下,我們可以決定什么時(shí)候裝載和卸去DLL,以及決定加載哪個(gè)DLL,可以節(jié)約系統(tǒng)資源,代碼執(zhí)行效率高。   3.2 VC程序與測(cè)試模塊間的通信   在用VC++調(diào)用CVI的DLL時(shí),存在著在不同軟件程序間的數(shù)據(jù)傳遞問(wèn)題,工程中VC++程序是主干,它調(diào)用DLL,因此它的變量對(duì)DLL來(lái)說(shuō)都是透明的、可用的;但是由Lab Windows/CVI開發(fā)的DLL文件生成的導(dǎo)出庫(kù)文件(.lib)不包含導(dǎo)出變量,因此DLL中的變量值,VC++不能直接獲得。工程中采用創(chuàng)建內(nèi)存映射文件的方法來(lái)實(shí)現(xiàn)二者之間的數(shù)據(jù)傳遞。所謂內(nèi)存映射文件是指在內(nèi)存中申請(qǐng)一塊內(nèi)存空間,將一個(gè)文件與這塊空間相聯(lián)系,再進(jìn)行內(nèi)存映射,這樣操作文件就有和操作內(nèi)存一樣的效率,數(shù)據(jù)可以通過(guò)該映射文件進(jìn)行中轉(zhuǎn)(寫入和讀出),幾個(gè)進(jìn)程可通過(guò)操作該映射文件,實(shí)現(xiàn)進(jìn)程間在內(nèi)存一級(jí)的高速數(shù)據(jù)交互。   具體方法為:首先在DLL中通過(guò)API函數(shù)CreateFileMapping及MapViewOfFile在內(nèi)存中建立一個(gè)文件映射對(duì)象并產(chǎn)生它的一個(gè)視,然后通過(guò)CopyMemory將測(cè)控?cái)?shù)據(jù)存入   該視中,然后應(yīng)用程序就可使用OpenFileMapping打開該映射文件并對(duì)其進(jìn)行讀寫操作,從而實(shí)現(xiàn)二者間通信。 4 代碼實(shí)例   限于篇幅,文中只給出部分重要的程序代碼。   4.1 CVI中程序代碼   1)對(duì)源文件的main函數(shù)進(jìn)行改寫:   int main1 (HINSTANCE CVIUserHInst)// 修改函數(shù)名以及參數(shù)   {   if ((panelHandle = LoadPanelEx (0, "get.uir", PANEL,__CVIUserHInst)) < 0) //使用loadPanelEx函數(shù)可導(dǎo)出回調(diào)函數(shù)   return -1;   ……   return 0;  ?。?  ?。?)創(chuàng)建內(nèi)存映射文件并拷入數(shù)據(jù)   hValue=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,0x300,"MapFile");//建立文件映射對(duì)象,MapFile為 映射文件名   ……   ipmid=(mid*)MapViewOfFile(hValue,   FILE_MAP_ALL_ACCESS,0,0,0);//創(chuàng)建映射對(duì)象的一個(gè)視,mid為測(cè)控?cái)?shù)據(jù)類型   ……   CopyMemory(ipmid,&data,sizeof(mid));//將數(shù)據(jù)拷貝到共享的內(nèi)存中  ?。?)在.h文件中加入修改后的main函數(shù)的導(dǎo)出聲明   int main1 (HINSTANCE CVIUserHInst);   4.2 VC中程序代碼   typedef int(*main1)(HINSTANCE); HINSTANCE USEInst;   USEInst=LoadLibrary("sousuoleidafashe_dbg.dll"); //加載DLL   main1 main; main=(main1)GetProcAddress(USEInst,   "main1");//得到DLL中導(dǎo)出函數(shù)main1的地址   main(USEInst);//執(zhí)行main1,調(diào)出儀器軟面板進(jìn)行測(cè)試,測(cè)控?cái)?shù)據(jù)寫入”MapFile”中   FreeLibrary(USEInst);   HValue=OpenFileMapping(…);//打開映射文件”MapFile”   ipmid=(mid*)MapViewOfFile(hValue;   FILE_MAP_ALL_ACCESS,0,0,0); //得到測(cè)試數(shù)據(jù)   至此,就完成了LabWindows/CVI中的DLL開發(fā)和VC++主干程序?qū)λ恼{(diào)用工作以及數(shù)據(jù)傳送工作。 5 結(jié)束語(yǔ)   本文介紹了一種把VC++和LabWindows/CVI結(jié)合起來(lái)進(jìn)行測(cè)控系統(tǒng)開發(fā)的方法,根據(jù)兩種開發(fā)工具各自的優(yōu)缺點(diǎn),取VC++對(duì)數(shù)據(jù)庫(kù)、多媒體等的強(qiáng)大的開發(fā)能力和它廣泛的適用性,結(jié)合LabWindows/CVI對(duì)測(cè)控?cái)?shù)據(jù)強(qiáng)大的分析處理能力和它簡(jiǎn)單直觀的儀器軟面板設(shè)計(jì)方法。實(shí)踐證明這種方法是完全可行的。 6 參考文獻(xiàn)   [1]NI Corporation.LabWindows/CVI User Interface Reference Manual [M/CD], 1996.   [2] 張磊, 虛擬儀器測(cè)試系統(tǒng)中實(shí)現(xiàn)數(shù)據(jù)共享的方法[J],計(jì)算機(jī)自動(dòng)測(cè)量與控制, 2000年第05 期:58-60   [3] 白鳳山,動(dòng)態(tài)連接庫(kù)(DLL)在虛擬儀器中的應(yīng)用[J],自動(dòng)化與儀表,第16卷,2001年第01期:21-22   [4] [美]David J.Kruglinski,Visual C++ 技術(shù)內(nèi)幕[M],北京,清華大學(xué)出版社,1999年

標(biāo)簽:

點(diǎn)贊

分享到:

上一篇:Red Lion T48-1/16DIN溫度控...

下一篇:微能WIN-V63矢量控制變頻器在...

中國(guó)傳動(dòng)網(wǎng)版權(quán)與免責(zé)聲明:凡本網(wǎng)注明[來(lái)源:中國(guó)傳動(dòng)網(wǎng)]的所有文字、圖片、音視和視頻文件,版權(quán)均為中國(guó)傳動(dòng)網(wǎng)(www.treenowplaneincome.com)獨(dú)家所有。如需轉(zhuǎn)載請(qǐng)與0755-82949061聯(lián)系。任何媒體、網(wǎng)站或個(gè)人轉(zhuǎn)載使用時(shí)須注明來(lái)源“中國(guó)傳動(dòng)網(wǎng)”,違反者本網(wǎng)將追究其法律責(zé)任。

本網(wǎng)轉(zhuǎn)載并注明其他來(lái)源的稿件,均來(lái)自互聯(lián)網(wǎng)或業(yè)內(nèi)投稿人士,版權(quán)屬于原版權(quán)人。轉(zhuǎn)載請(qǐng)保留稿件來(lái)源及作者,禁止擅自篡改,違者自負(fù)版權(quán)法律責(zé)任。

網(wǎng)站簡(jiǎn)介|會(huì)員服務(wù)|聯(lián)系方式|幫助信息|版權(quán)信息|網(wǎng)站地圖|友情鏈接|法律支持|意見反饋|sitemap

中國(guó)傳動(dòng)網(wǎng)-工業(yè)自動(dòng)化與智能制造的全媒體“互聯(lián)網(wǎng)+”創(chuàng)新服務(wù)平臺(tái)

網(wǎng)站客服服務(wù)咨詢采購(gòu)咨詢媒體合作

Chuandong.com Copyright ?2005 - 2024 ,All Rights Reserved 版權(quán)所有 粵ICP備 14004826號(hào) | 營(yíng)業(yè)執(zhí)照證書 | 不良信息舉報(bào)中心 | 粵公網(wǎng)安備 44030402000946號(hào)