* 实践与经验 *

用DLL实现Visual Basic 5.0 与

Fortran PowerStation 4.0的接口

殷国锋 周志芳 (河海大学土木工程学院 南京 100098)

摘 要 本文介绍了如何通过DLL实现VB5.0和Fortran PowerStation4.0的接口。该方法为编制Windows95下的数值计算事件驱动程序提供了一条方便的途径。

关键词 动态链接 函数 子程序 声明

     1 引言

      众所周知,Fortran语言自从50年代问世以来,一直是数值计算领域所使用的主要语言,以往大量的科学与工程计算程序都是在DOS下用Fortran语言编写的。Microsoft公司推出的Windows95和WindowsNT下的32位的Fortran PowerStation4.0(以下简称FPS4.0)是一种功能强大的Fortran集成开发环境。它几乎完全兼容Fortran90和Fortran77标准,并提供了与当今流行的Windows95的接口。利用FPS4.0和Windows其他编程工具(如VisualC++和VisualBasic等)能很容易开发出Windows95下的Windows事件驱动程序。在Windows的诸多编程工具中,VisualBasic以其简单易学、功能强大等优点而广受非计算机专业人员欢迎。经过一段时间的探索,笔者成功地把FPS4.0和VisualBasic5.0(以下简称VB)通过DLL技术结合起来,编制出Windows95下的Windows事件驱动程序。这样使得应用程序既具有Windows环境图形用户界面的友好性,又能充分利用Fortran原有的丰富资源(如大量先前开发的DOS下的科学与工程计算程序等)。

      本文的基本思路是用VB设计用户界面及控制程序,而将计算用Fortran程序通过FPS4.0编译成DLL,并由VB调用。它们之间的数据交换通过参数传递来实现。

     2 用FPS4.0创建DLL

      DLL(动态链接库)是可被其他程序或DLL调用的函数(过程)集合组成的可执行文件模块。Windows本身提供了大量的应用程序接口(API)函数,都是通过DLL机制来实现的。DLL之所以在Windows中被广泛应用,是因为它除了具有静态链接库的功能外,尚有如多个应用程序共享一个DLL以节省内存和磁盘空间等许多优点。

      在FPS4.0中,可根据需要将一组Fortran函数或子程序放在一个程序中,创建成一个DLL,它本身不能运行,只能被VB调用。

      具体实现步骤如下:先建立一个New Project Workspace,定义其类型为DynamicLinkLibrary,然后将一个只含有函数或子程序的Fortran程序加入到Project中,编译通过即可生成DLL。在Fortran程序中,必须被调用的函数或子程序予以声明,以标识这些函数或子程序在所生成的DLL中是可用的。具体语法如下:

      $ATTRIBUTES DLLEXPORT ∷Name

      $ATTRIBUTES是FPS4.0中的元命令(metacommand),用于声明微软扩展属性(Microsofttextendedattributes)。DLLEXPORT是上述属性之一,它的作用就是声明该函数或子程序能被其他程序或DLL调用。Name为函数或子程序名。该语句应放在程序的变量声明处。

     3 VB调用Fortran DLL

      VB在调用DLL前,必须先在模块级或相应Form中的GeneralDeclaration中,对被调用的DLL进行声明,语法如下:

[Public][Private] Declare sub Name lib "libname" [Alias"aliasname"] [(arglist)][Public][Private] Declare Function Name lib "libname" [Alias"aliasname"] [(arglist)]

      Declare语句的作用是声明对DLL中外部过程的引用。至于语句中各组成部分的意义,一般的VB书籍都有介绍,在此不再赘述。声明之后,VB中使用Call语句实现调用DLL中的函数或子程序,调用语句如下:Call Name(arglist)Name的意义同上。以上仅是VB中调用DLL的一般语法,下文对声明和调用过程中应注意的两点进行讨论。

      3.1 声明语句中对于Alias部分的处理

      一般Alias关键字指定函数或子程序的别名,这是因为有些DLL中的函数或子程序名称太长或名称上加有VB不能识别的不合法符号,或有些函数或子程序名与VB中的关键字重名,那么这时应将DLL库中真实的函数或子程序名写在别处。

      但在FPS4.0生成的DLL中,每一个声明的函数或子程序均有一个别名,都需用Alias关键字进行声明。该别名在编译生成的库文件(.LIB)中可以找到。经过笔者反复调试,发现它的命名有一定的规律可循,即如果函数或子程序名为name1,则别名为_name1@x,其中x为一整数,x等于函数或子程序的参数个数乘以4。特别要注意,若函数或子程序的参数个数为0那么x也为0。具体的实现可见下文实例。

      3.2 调用过程中的参数传递

      要使VB正确地调用FortranDLL,另一个值得注意的问题是调用过程中的参数传递。由于FPS4.0和VB在数据定义类型上的不一致,因此在VB的Declare语句中的参数列表中,必须将Fortran程序的参数类型正确地对应到VB中。两种系统的参数对应关系见表1。

表1 FPS4.0和VB主要参数传递对照表

FPS4.0 INTEGER INTEGER(2) REAL*4 REAL*8

VB LONG INTEGER SINGLE DOUBLE

      另外,如果所传递的参数是数组类型,则在VB的Declare语句中应把数组的第一个元素作为参数放在参数列表的对应位置。

      4 VB调用FPS4.0 DLL实例

      为了具体说明上述过程的细节,本文列举了一个功能简单的程序如下:EXAM.F是一个含有子程序ARRAYTEST的Fortran程序。子程序ARRAYTEST(arr,n)的功能是改变两个参数的值并返回。

程序代码如下:

SUBROUTINE ARRAYTEST(n,arr)

$ATTRIBUTES DLLEXPORT :: ARRAYTEST

INTEGER n,i,j

REAL(4) arr(3,3)

DO i=1,3

DO j=1,3

arr(i,j)=10.1*i+j

END DO

END DO

n=n+10

END SUBROUTINE

      编译后产生EXAM.DLL文件。由于子程序ARRAYTEST只有两个参数,故它的别名为_ARRAYTEST@8。EXAM.VBP是一个VB程序,它包含一个窗体FORM1.FRM;一个命令按钮Command1和两个文本框Text1、Text2。两个文本框的作用是为了显示返回的结果,以检验程序是否正确执行。FORM1.FRM代码如下:

Private Declare Sub ARRAYTEST Lib "EXAM.dll" Alias "_ARRAYTEST@8" (XAS LONG,Y AS SINGLE)

Private Sub Command1_Click()

Dim a As Long

Dim ab(1 To 3, 1 To 3) As Single

a=10

Call ARRAYTEST(a,ab(1,1))

Text1.Text=Str(a)

Text2.Text=Str(ab(3,3))

End Sub

      运行后Text1.Text为20,Text2.Text为33.3,结果正确。

     5 结束语

       本文探讨了Windows95下VB和FPS4.0通过DLL实现联合编程的方法。利用VB的可视化开发环境和FPS4.0可以使Fortran应用程序具有直观、操作方便的图形界面,文中所述方法为广大DOS下Fortran用户升级应用程序提供了一条简便、快捷的途径。

参 考 文 献:

[1]《软件开发文集》第四辑 《软件开发文集》编委会,北京,科学出版社,1996

[2]《软件开发文集》第七辑 《软件开发文集》编委会,北京,科学出版社,1996

[3]张丽萍,实现VB4.0与Fortran90的接口,计算机系统应用,1998.9

[4]周伯生,用Fortran开发Windows事件驱动式程序,中国计算机用户,1996.20

本文系Email投稿,收稿日期:1998年11月1日 Email:njzzzfly@pub.jlonline.com

上一页

返回目录

下一页