声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3256|回复: 3

[VB] VB调用FORTRAN编写的DLL

[复制链接]
发表于 2007-3-29 10:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
我用FORTRAN95编写了一个DLL,在VB中调用的时候总是提示找不到函数入口,找到MSDN的解释是:函数名称不对,问题是我已经检查了很多遍,函数名称是对的!而且用FORTRAN自己调用确没问题!
       请问高手,VB调用所有语言的DLL的格式是否是一样的?这个问题出在哪??
回复
分享到:

使用道具 举报

发表于 2007-3-30 10:26 | 显示全部楼层
是不是需要将你自己编的dll放入到系统默认的路径中?我没有调用过系统以外的dll,只是猜测
 楼主| 发表于 2007-3-31 10:09 | 显示全部楼层
不是,我在VB里详细的声明了DLL的路径,应该没问题!
发表于 2007-4-2 09:36 | 显示全部楼层
3 VB调用Fortran DLL
    VB在调用DLL前,必须先在模块级或相应Form中的GeneralDeclaration中,对被调用的DLL进行声明,语法如下:

  1. [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主要参数传递对照表

  1. FPS4.0 INTEGER INTEGER(2) REAL*4 REAL*8
  2. VB LONG INTEGER SINGLE DOUBLE
复制代码


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

    4 VB调用FPS4.0 DLL实例

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

程序代码如下:

  1. SUBROUTINE ARRAYTEST(n,arr)
  2. $ATTRIBUTES DLLEXPORT :: ARRAYTEST
  3. INTEGER n,i,j
  4. REAL(4) arr(3,3)
  5. DO i=1,3
  6. DO j=1,3
  7. arr(i,j)=10.1*i+j
  8. END DO
  9. END DO
  10. n=n+10
  11. END SUBROUTINE
复制代码


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

  1. Private Declare Sub ARRAYTEST Lib "EXAM.dll" Alias "_ARRAYTEST@8" (XAS LONG,Y AS SINGLE)
  2. Private Sub Command1_Click()
  3. Dim a As Long
  4. Dim ab(1 To 3, 1 To 3) As Single
  5. a=10
  6. Call ARRAYTEST(a,ab(1,1))
  7. Text1.Text=Str(a)
  8. Text2.Text=Str(ab(3,3))
  9. End Sub
复制代码


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

摘自:河海大学土木工程学院殷国锋、周志芳写的文章

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-24 21:57 , Processed in 0.074249 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表