回 帖 发 新 帖 刷新版面

主题:[讨论]求教!vb与fortran的混合编程

各位大侠:
     小弟想实现在vb环境下调用fortran程序。但我用compaq fortran v6.6 生成的dll文件在vb环境中调用时,出现如下错误“error dll calling convention”。请大侠给予指教。十分感谢!附程序如下
fortran程序:
    subroutine TESTED(a,b,c)
!DEC$ ATTRIBUTES DLLEXPORT::TESTED
    real a,b,c
    c=a+b
    return
    end 
vb程序:
Private Declare Sub TESTED Lib "D:\STUDY\FortranAndVB\TESTED\Debug\TESTED.dll" (vba As Single, vbb As Single, vbc As Single)
Private Sub Command1_Click()
Dim vba As Single
Dim vbb As Single
Dim vbc As Single
vba = 15
vbb = 12
'vbc = vba + vbb
Call TESTED(vba, vbb, vbc)
Text1.Text = vbc
End Sub

----期待中。。。。

回复列表 (共20个回复)

沙发

错误的DLL调用协议
请确定你的DLL导出函数使用__stdcall协议

板凳

谢谢你能帮我看着问题!但麻烦你能详细指点一下不?是我编的的那个程序的问题还是编程软件问题啊?

3 楼

照Fortran里面的代码来看,VB里的声明应该这样:
Private Declare Sub TESTED Lib "D:\STUDY\FortranAndVB\TESTED\Debug\TESTED.dll" ([color=0000FF]ByVal[/color] vba As Single, [color=0000FF]ByVal[/color] vbb As Single, [color=0000FF]ByVal[/color] vbc As Single)

但照VB里面的代码来看,你是想按址传递,试试在Fortran里面这样声明:
subroutine TESTED(a [REFERENCE], b [REFERENCE], c [REFERENCE])

声明:
本人从来没接触过Fortran,错了别骂,我也是刚从百度找来,按自己的经验给的答案。
请楼主自己参阅:
[url]http://support.microsoft.com/kb/123841/zh-cn[/url]

4 楼

多谢!我已解决此类问题。非常感谢你的帮助!以后我要还有其他问题的话,希望你能多加指点指点我啊。。。

5 楼


你好,希望发帖人还能关注
我也遇到和你类似的问题了,能否告诉我你的经验啊?
希望你能帮助我,谢谢

6 楼


你好!那我就给你讲讲我怎么解决我那个问题的吧。
    要想在vb环境下调用fortran程序。运用compaq viual fortran就行了(我用的是6.6版本的,好像6.6版本建立的dll不太通用,我现在就有这个问题,你可以帮我研究研究),没有必要用fortran power station。首先打开compaq visual fortran6.6,建立fortran DLL的工程。然后把你所编译的fortran子程序放到你所建立的DLL工作空间中去,点击编译就行了,然后你在debug文夹中就能看到你所要的dll文件了。当然,在你所编译的子程序中少不了声明能在vb调用的语句了。在你开始生成的dll工作空间中,有一个子程序(这是一个调用的声明文件,仔细看看,就能找到这个声明语句,或者,你有很多子程序的话,吧你第一个子程序复制到这个声明文件中也行)
    这是我的一点小小的经验之谈,希望能起到抛砖引玉的作用,能解决你的问题。让这个版里面的大虾们见笑了。呵呵。。。

7 楼

虽然我不用,但我还是在这里称赞楼主!
能在问题及绝后和大家分享心得,实在难得。
给予嘉奖!

8 楼

多谢 
我在收到你回复之前,又改动了一下,结果一点击运行VB就出错自动关闭了,这是为什么呢?
我用的是6.5版本的Fortran。
“[color=0000FF]在你开始生成的dll工作空间中,有一个子程序(这是一个调用的声明文件,仔细看看,就能找到这个声明语句,或者,你有很多子程序的话,吧你第一个子程序复制到这个声明文件中也行)[/color]”
不是太明白,我是直接给的路径到*.dll文件的
还要麻烦你一下了,我调用Fortran是要实现输入几个参数后,返回一个数组的功能。请问有什么要特别注意的吗?

9 楼

你好!你说的这个功能我没用过。但你可以现在fortran程序里头把所要输出得数组放到dat文件中,然后由vb来读取就行了。我最近也是这样做的。

10 楼

非常感谢“老大徒伤悲”的赞赏,其实我的问题是大家解决出来的。我再返还给所需要用的人也是应该的!呵呵。。。同时我也希望这个版能够越办越好,希望今后会有更多的人站出来,大家可以一起相互交流,这才是一大幸事!

我来回复

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