回 帖 发 新 帖 刷新版面

主题:[讨论]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)

回复列表 (共8个回复)

沙发

你自己用 DependencyWalker 查看一下 DLL 文件的导出函数,就知道有没有这个函数导出了。

板凳

今天又分析了半天,终于解决了这个问题
原来是调用函数名称大小写的问题
Fortran编译成的Dll函数默认名都是大写的,没有注意到这个!所以才出现之前的问题!
虽然这个问题解决了,但是又有了新问题。
在此在想大家提一下:
我上面的那个程序,其实是个试验测试用的代码。真正要编译的代码比这复杂的多,Fortran源码里有一个主程序,若干子程序,主程序会在需要的时候随时调用子程序,调试了一下,程序能够正确运行。随后就把代码修改成Dll格式的,and这主程序和这些子程序编译成了一个Dll,然后用了一个excel VBA里的窗体按钮调用了这个dll,运行之后发现,这个dll确实被调用了,而且dll的功能也实现了(从输出的文本文件可以看出来,所需要的文件都输出了,结果也对!),但是VBA程序出现了致命错误:excel 应用程序窗口出错,excel需要关闭。现在问题就卡在了这里,也不知道是什么原因!

3 楼

你好,如果用dependency walker检测出来没有导出函数,那应该怎么解决这个问题呢?谢谢!!

4 楼

[quote]你好,如果用dependency walker检测出来没有导出函数,那应该怎么解决这个问题呢?谢谢!![/quote]
……
检查自己写的代码

5 楼

[quote][quote]你好,如果用dependency walker检测出来没有导出函数,那应该怎么解决这个问题呢?谢谢!![/quote]
……
检查自己写的代码[/quote]
哈哈,答得好答得妙,答得呱呱叫:)

6 楼

佩服!!
出了问题首先就是检查自己的代码,可是像这种问题有木有就是说主要是哪里出现了问题。因为像大型程序中,光是说检查自己的代码,那是一件比较复杂的事情。所以我的意思是罪魁祸首在哪里?谢谢

7 楼

呵呵,刚开始接触混合编程,还是有很多问题,以后请你们多多指教!!

8 楼

既然没有导出函数,那自然看你写的导出函数部分有什么问题

我来回复

您尚未登录,请登录后再回复。点此登录或注册