摘要:介紹了在CVI中通過DLL的方式來使用C++語言的編程方法,給出了實現例子,并驗證了其有效性。實現了在CVI中使用C++語言的程序設計。
關鍵詞:C語言;C++語言;CVI
中圖分類號:TP312文獻標識碼:A文章編號:1009-3044(2008)15-20ppp-0c
How to Use C++ Language in CVI
ZHANG Fu-song
(Unit 92941 of PLA,Huludao 125001,China)
Abstract:This article introduced a programming method of using C++ in CVI through DLL, giving an detailed example and validating itsavailability. The using C++ language programming in CVI is implemented.
Key words:C language;C++ language;CVI
1 引言
LibWindows/CVI是美國國家儀器公司(簡稱NI公司)推出的交互式C語言開發環境,CVI將功能強大、使用靈活的C語言與用于數據采集分析和顯示的測控專業工具有機地結合起來,它的集成化開發環境、交互式編程方法、函數面版和豐富的庫函數大大增強了C語言的功能,為熟悉C語言的開發人員建立檢測系統、自動測試系統、數據采集、過程監控、虛擬儀器等提供了一個理想的軟件開發環境,在我國已經得到了較為廣泛的應用。
而C++語言作為C語言的超集,以其面向對象、封裝、繼承和多態的特點在軟件開發領域后來居上,它的面向對象的特點更符合人們的思維方式,其運行代碼要比C語言簡潔、易于理解,尤其是新的標準中增加了模板、通用容器、STL(Standard Template Library)算法等內容,模板的引入對C++程序設計者來說是一場革命,自此,C++程序設計煥然一新。
兩種語言各有特點,各有所長,C++語言兼容C語言,對于一個習慣于面向對象設計的程序員來說,CVI是面向過程的語言,用大量的回調函數來處理消息,無疑是一種痛苦,想用別的語言來代替,又有困難,CVI中有很多專有的函數和儀器面版控件,別的軟件不能提供替代的產品,那么,能不能即使用CVI來開發軟件,又能使用C++的新增功能哪?能,就是通過動態鏈接庫來實現。
2 使用動態鏈接庫(DLL)將C++特性過程化
DLL是一種基于Windows的程序模塊,不僅包含函數,還可以包括數據和各種資源,庫中的函數可以被應用程序或其它的DLL調用。使用DLL有如下的優點:
1)如果不同的程序使用相同的DLL,只需在內存中將DLL裝載一次,節省了內存。
2)可以使用DLL的不同版本來代替當前的DLL。只要DLL中子例程有相同的參數,則可以使用新版本的DLL運行程序,而不用重新編譯它。
3)如果有一個非常大且需要不斷更新或改正錯誤的應用程序,則可以將它劃分為多個執行部分與DLL。這樣允許我們只對需要改變部分進行操作,而不用對整個大執行文件進行改動。
4)支持多國語言。開發者可將依賴于語言的函數和資源分離出來,建立DLL的不同版本來保存不同語言的字符串,然后在運行時改變語言;或可以設計圖標與位圖,而后在不同的應用程序中使用它們,這是實現軟件商品國際化的一項技術。
5)DLL獨立于編程語言。這意味著在VC++環境中開發的DLL可以在C++ Builder、VB、CVI等環境下使用。
可以看出,DLL是由函數組成的。而在面向對象的程序設計中,程序是由不同的對象組成的,程序運行過程就是調用對象的方法;所以,如果我們需要使用C++的新特性,就需要把調用對象的方法改為調用函數,這樣,就把調用接口轉換成C語言格式了,就可以使用C++的新特性了。
3 實現方法
下面以在DLL中實現C++中的浮點型堆棧stack
1)在VC++環境下新建DLL工程,進入VC++,選擇New,選擇Projects,選擇Win32 Dynamic-Link Library,給出工程名程(本例是DLL),選擇一個路徑來保存文件,選擇OK按鈕,進入下一個頁面,選擇A Simple DLL Project,選擇Finish按鈕,進入下一個頁面,選擇OK按鈕,則生成有關的框架文件,在左面的小窗口中選擇File View菜單,選擇Source Files,選擇DLL.cpp,雙擊該文件,如下所示,生成一個框架文件:
#include \"stdafx.h\"
BOOL APIENTRYDllMain( HANDLE hModule,DWORDul_reason_for_call,LPVOID lpReserved )
{
return TRUE;
}
2)在#include \"stdafx.h\"語句下面添加如下代碼:
#include
#include
stack
extern \"C\" __declspec(dllexport) voidpush_float(float x)
{
stackfloat.push(x);
}
extern \"C\" __declspec(dllexport) float pop_float()
{
float temp = stackfloat.top();
stackfloat.pop();
returntemp;
}
3)選擇菜單Build,選擇Build DLL,則系統完成編譯工作。在工作目錄的Debug目錄下生成生成了DLL.dll和DLL.lib和其它文件,這兩個文件在下面的工作中將會被使用。
4)退出VC++,運行CVI,新建一個C文件,內容如下:
#include
#include
#include
extern__declspec(dllimport) voidpush_float(float x) ;
extern__declspec(dllimport) float pop_float(void);
int main (int argc, char *argv[])
{ int i; float temp; char cc[40];
if (InitCVIRTE (0, argv, 0) == 0) return -1;
for(i = 0 ; i < 10 ; i++) push_float(i+0.5);
for(i = 0 ; i < 10 ; i++) {
temp=pop_float() ;
sprintf(cc,\"The pop num is %5.1f\",temp);
MessagePopup (\"Using a DLL\", cc);
}
CloseCVIRTE ();
return 0;
}
5)將VC++生成的DLL.dll和DLL.lib復制到當前的工作目錄下,選擇工程窗口,單擊右鍵,選擇Add File,在新彈出的窗口中選擇DLL.lib,選擇OK,選擇運行程序,則程序會依次顯示出棧的數字,程序驗證完畢。
6)以上程序中,CVI在安裝時要選擇與微軟公司的C++編譯器兼容模式。
4 可以使用的C++特性
C++還提供了很多提高程序員工作效率的機制和庫工具,比如模板(template),包括模板函數和模板類,能讓程序員“批量”生產代碼。通用算法,包括填充和生成、計數、操作序列、查找和替換、比較范圍、刪除元素、對已排序的序列進行排序和運算、數值算法。通用容器,包括向量、鏈表、雙端隊列。集合、堆棧、單端隊列和映像等工具。
5 結束語
通過這種變通的方式,程序員就可以在CVI中使用C++語言中的先進的編程方式和各種便利,節省了時間與精力,可謂一舉兩得,有興趣的C++編程人員可以一試。本方法已在某型裝備的測試程序中獲得應用。
參考文獻:
[1]Bruce Eckel,Chuck Allison.C++編程思想第2卷 實用編程技術[M].機械工業出版社,2006.
[2]Herbert Schildt.C語言大全[M].郭興社,戴建鵬,譯.電子工業出版社,1990.
[3]張毅剛,喬立巖.虛擬儀器軟件開發環境Lab Windows/CVI6.0 編程指南[M].機械工業出版社,2002.
收稿日期:2008-03-07
作者簡介:張富松(1967-),男,工程碩士,主要從事導彈測試研究。