摘 要: 为了准确传递和保存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.