摘
要:介绍了C++和Fortran 90混合语言编程中,在C++中调用Fortran动态连接库(DLL,Dynamic
Link Library)的方法以及参量传递、函数调用等的方法。
关键词:混合编程,Fortran 90,C++,动态连接库
前言
混合语言编程是利用二种或二种以上编程语言编写的源码构建程序模块的过程。混合语言编程有以下优点:(1)调用已经存在的源码,如许多单位以前的计算机程序大部分都是用Fortran语言编写的,为了有效地利用现有的程序,减少不必要的重复性工作,可把原有的源码编译成动态连接库(Dynamic
Link Library,
DLL),以便于其它编程语言的调用;(2)利用某语言处理某些问题特有的速度和优势,如Fortran语言具有强大的科学计算速度和能力,Visual
C++、C++ Builder、Visual Basic、Power
Builder或Delphi具有良好的图形用户界面。
DLL提供了一种在Windows环境下共享代码和在应用程序间进行通信的方法。DLL可以用多种语言编写,只要遵循一定的规范,不同语言编写的DLL可以互相调用。在工程开发中,利用图形用户界面友好的开发工具作为前端开发工具,并在其中调用由其它语言实现的具有特殊功能的DLL模块,可提高工程开发质量和效率。本文介绍C++
Builder中调用DLL的方法,其中的DLL是用Fortran语言编写的。
调用DLL的方法
2.1 调用DLL的方式
C++应用程序中调用DLL中的函数有两种方式:静态引入方式和动态引入方式[1]。
2.1.1 静态引入方式
静态引入方式,就是在编译连接阶段就已经确定了要调用的函数程序,运行时自动加载相应的DLL,直到程序结束前,该DLL始终存在于内存中。静态加载一个DLL,方法比较简单,只需在应用程序连接时,把DLL相应的库文件加入到应用程序工程中。虽然这种引入DLL的方式简单,但它有很大的缺陷,如DLL加载后,就一直驻留在内存中,即使DLL已经不再使用。而动态引入方式,没有这些缺陷。下面重点介绍动态引入DLL的方法。
2.1.2 动态引入方式
动态引入DLL,需要用到三个API函数,它们是LoadLibrary函数、GetProcAddress函数和FreeLibrary函数。
(1)LoadLibrary函数
LoadLibrary函数的原型为:HINSTANCE LoadLibrary(LPCTSTR
lpLibFileName)。lpLibFileName用于指定要装载DLL文件的路径和文件名。如果函数执行成功,则返回装载模块的实例句柄。否则,返回一个小于HINSTANCEERROR的错误代码。如果在应用程序中用LoadLibrary调用某一个模块前,其它应用程序已经把该模块装入内存,则LoadLibrary并不装载该模块的另一个实例,而只是使该模块的“引用计数”加1。LoadLibrary函数用于匹配(Map)被调用模块,返回被装载模块的实例句柄用于GetProcAddress函数中。
(2)GetProcAddress函数
该函数得到给定模块中函数的地址,原