摘 要: 為了準確傳遞和保存IDL可視化數據信息,實現語言之間的互通性、資源共享性、數據信息的多樣性、調用格式的不同性,基于解析函數調用的方法,運用動態鏈接庫和一系列的子類函數獲取數據,使IDL與VC之間相互轉換信息,可通過VC直接對遙感影像進行處理,為應用系統的研發提供了一種新方法。試驗實例證明,該方法能簡單有效地將IDL與VC有機地結合在一起,實現了信息相互傳遞,并通過C直接對遙感影像進行操作處理。
0 引言
隨著遙感技術的不斷發展,交互式語言(IDL)成為人們關注的重要語言[1],在眾多行業廣泛應用。由于大部分軟件和通信保存格式都是用高級語言C來編寫的,因此,將IDL和C語言有機地結合在一起,且不需要改寫原有的程序就能將遙感信息數據傳遞并保存,成為當前遙感領域急需解決的問題之一。C語言具有通用性、可擴展性、廣泛性強的特點[2],因此應用最為廣泛。目前,IDL與C語言的結合還比較少,各個國家都開展了IDL與C語言接口信息傳遞的研究,而中國在這方面還處在探討階段。因此,如何將IDL有效信息通過C語言傳遞并保存成為目前遙感領域以及高級語言領域里一個值得研究的方向。本文提出了一種函數調用方法,有效地實現了信息在IDL與C語言之間的傳遞。
1 開發語言的使用
IDL是一種數據可視化面向矩陣的第4代交互式計算機語言,是集成可視化、大型商業開發、交互式分析為一體的高級開發環境[1]。IDL主要面向對象為可視化數據分析,它的語法結構簡單、功能強大、編程效率高,簡單的編程實現復雜的圖像分析,是跨平臺應用開發的最佳選擇,它提供的圖像類能夠快速地對圖像進行分析,可與OpenGL相媲美,因此被廣泛地應用在遙感領域中[3]。
IDL支持各種操作系統平臺,具有很好的移植性,為與VC相結合提供了基礎。VC是微軟推出的運行非常穩定、非常有影響力的專業級程序設計與數據處理語言。將IDL與VC有機地結合在一起,發揮各自優點,以實現資源共享,使IDL的信息具有廣泛性和通用性。
2 解析函數調用方法
IDL為了擴充編程和數據處理能力,提供了應用程序接口(API)技術。利用API技術可方便地實現在IDL中調用VC的可執行文件、函數和程序。數據傳遞總體框圖如圖1所示。
2.1 IDL調用VC
在IDL中調用VC可以使用3種方法:SPAWN方法、LINKIMAGE方法和CALL-EXTERNAL方法。利用SPAWN方法可以直接調用VC的可執行文件,但是執行調用不帶參數的SPAWN命令時,將調用Windows的DOS Shell命令窗口,使用時需要轉換。LINKIMAGE方法是通過系統所支持的動態鏈接接口完成程序調用任務,但使用此方法,開發者需要有豐富的IDL內部知識,該方法不適合一般的開發者使用。利用CALL-EXTERNAL方法能夠在IDL調用VC中精準地匹配數據結構,對于非結構數據的傳輸,不需要調用其他命令窗口,具有LINKIMAGE方法的優點,但不需要開發者對IDL內部特別熟悉,因此本文選用CALL-EXTERNAL方法來調用VC程序[4]。
IDL程序能在運行時動態調用VC程序,通過CALL-EXTERNAL接口函數裝入共享目標庫實現函數調用,在Windows平臺上,IDL通過動態鏈接庫技術來實現,能夠方便地實現模塊化[5]。IDL調用動態鏈接庫遵循C語言中函數調用協議。任何的動態庫調用原型都被定義成return-type()形式,返回值必須是CALL-EXTERNAL函數支持的數據類型。其中所有的參數都能以“傳值”或“引用”方式進行傳遞。程序編寫流程圖如圖2所示。
根據流程圖編寫程序。調用VC輸入數據最終顯示結果如圖3所示。可以看出,該方法編寫的程序能夠很好地調用VC輸入的數據,從而表明此方法的正確性、可行性。
2.2 VC調用IDL
利用IDL的API,可以實現VC調用IDL的命令、函數和數據。調用IDL的技術在操作系統中都會調用IDL的驅動程序,而驅動程序會存在于IDL動態鏈接庫中[6],調用時主要的3個環節如下。
(1)初始化IDL。在調用IDL之前要對IDL進行初始化,使用IDL_Win32Init()函數來對IDL進行初始化,使用方法為:
int IDL_Win32Init()(int abc,void*hst,void*use,void*null);
其中,abc取值為0保留參數,后面兩個參數都是句柄,null也是一個保留參數取值為NULL的數,當初始化成功返回值為“TURE”。
(2)VC應用程序中輸出在同一個邏輯窗口,當IDL被調用時,默認的輸出函數會被IDL所覆蓋,需要通過IDL_ToutPush和IDL_ToutPop來轉移IDL的輸出結果到指定的函數中。IDL中提供了IDL_Execute()和IDL_ExecuteStr()兩個函數,用于在其他語言中調用IDL語句,調用具體形式為;
int IDL_Execute(int argc,char*nrcv[]);
int IDL_Execute(char*comd);
(3)在調用完IDL語句之后主函數執行完之前,需要通過函數IDL_Cleaup來關閉IDL。調用方法為:
int IDL_Cleaup(int just cleanup);
根據IDL的調用方法在VC6.0的編譯環境下,通過動態鏈接庫實現一個能調用IDL的VC程序,程序編寫流程圖如圖4所示。
根據流程圖編寫程序具體實現VC調用IDL,VC程序調用“IDL輸入”的結果,在IDL編輯對話框輸入編輯內容,在VC編輯窗口點擊接收按鈕將“IDL輸入”數據顯示在VC編輯對話框的顯示框內,顯示結果如圖5所示。
3 實驗
根據上述方法可知,IDL與VC之間可以通過動態鏈接庫相互之間傳遞數據,由于IDL主要是GUI界面,大部分是對圖像進行處理,因此對圖像數據信息的傳遞尤為重要。根據上述方法進行程序的編寫,使VC能夠接收IDL圖像并以VC的保存格式來保存IDL的數據信息,并直接對圖像處理,再將處理結果直接傳遞給IDL。本文利用IDL編寫的水深反演軟件將處理的圖像信息按照上述方法傳輸給VC程序,利用VC來顯示IDL處理圖像的結果,如圖6和圖7所示。
根據圖像顯示結果可知,IDL和VC可以相互轉換數據,也可以將數據以它們各自的形式進行保存,從而說明IDL和VC可以很好地結合在一起,信息可以相互傳遞實現資源共享。
4 結論
本文介紹了將IDL和VC相互結合的方法,讓它們體現各自的特點,詳細描述了實現方法,并用實際例子來證明了本文方法的可行性和正確性。本文方法為IDL和VC混合開發軟件提供了參考基礎,也為兩種語言的應用研究開發提供了一種新的思路和方法,對IDL和VC資源共享的研究具有重要意義。
參考文獻
[1] 韓培友.IDL可視化分析與應用[M].西安:西北工業大學出版社,2006.
[2] 孫鑫,余安萍.VC++深入詳解[M].北京:電子工業出版社,2007.
[3] 陶治,張文濤,熊顯名,等.基于IDL生成XML文件實現信息傳遞的方法[J].桂林電子科學學報,2014,34(1):56-59.
[4] RSI. IDL reference guide(First Edition)[M]. American: RSI, 2005.
[5] 徐爐清,頓敦.動態鏈接庫(DLL)的應用[J].機械與電子,1999(4):19-48.
[6] 李義才,汪新慶,劉志軍,等.IDL與Visual C/C++語言進行混合編程的方法研究[J].計算機應用研究,2011(7):46-48.