以文本方式查看主题

-  Fortran中文网  (http://fortran.cn/bbs/index.asp)
--  Fortran语言开发经验交流  (http://fortran.cn/bbs/list.asp?boardid=3)
----  [求助]VBA调用Fortran DLL找不到入口 的问题  (http://fortran.cn/bbs/dispbbs.asp?boardid=3&id=2221)

--  作者:luna125
--  发布时间:2011/2/10 22:57:48

--  [求助]VBA调用Fortran DLL找不到入口 的问题
大家好,我在VBA中调用Fortran 编译的DLL时,出现错误:提示找不到入口函数!

我检查了几遍代码,也没看出什么问题!这里专家高手云集,希望能指点一下!

下面是我的代码:

1 、Fortran DLL源码:

      subroutine circle_area(radius,c_a)

!DEC$ ATTRIBUTES DLLEXPORT Alias "circle_area":: circle_area

!DEC$ ATTRIBUTES REFERENCE :: radius

!DEC$ ATTRIBUTES REFERENCE :: c_a

      implicit none

      real*4  :: radius

      real*4   :: c_a

      real, parameter :: PI = 3.14159      

    

      c_a = radius*radius*PI    

!        print*,c_a

      return

      end subroutine

2、VBA里代码

   声明部分:

   Option Explicit  

   Public Declare Sub circle_area Lib "I:\\S2_yaqiji\\test\\Release\\test.dll" (ByRef R As Single, ByRef A As Single)    

    调用部分:

   Private Sub CommandButton4_Click()

            Dim R As Single

            Dim A As Single

            R = 10

           Call circle_area(R, A)        

           MsgBox "调用了Test.dll,在半径为10时,计算面积A=" & A

     End Sub

4、在VBA里运行程序,出现如此的错误提示:

      运行时错误\'453’

      找不到DLL输入点 circle_area ,在 I:\\s2\\.....\\test.dll中!

点击浏览该文件

附件里有fortran代码和调用dll的VBA窗体代码(运行窗体后点击TestDLL就可以调用本dll)

[此贴子已经被作者于2011-2-10 22:59:57编辑过]


--  作者:luna125
--  发布时间:2011/2/11 19:09:08

--  
今天又分析了半天,终于解决了这个问题

原来是调用函数名称大小写的问题

Fortran编译成的Dll函数默认名都是大写的,没有注意到这个!所以才出现之前的问题!

虽然这个问题解决了,但是又有了新问题。

在此在想大家提一下:

我上面的那个程序,其实是个试验测试用的代码。真正要编译的代码比这复杂的多,Fortran源码里有一个主程序,若干子程序,主程序会在需要的时候随时调用子程序,调试了一下,程序能够正确运行。随后就把代码修改成Dll格式的,and这主程序和这些子程序编译成了一个Dll,然后用了一个excel VBA里的窗体按钮调用了这个dll,运行之后发现,这个dll确实被调用了,而且dll的功能也实现了(从输出的文本文件可以看出来,所需要的文件都输出了,结果也对!),但是VBA程序出现了致命错误:excel 应用程序窗口出错,excel需要关闭。现在问题就卡在了这里,也不知道是什么原因!


京ICP备05056801号