主题:[讨论]求教!vb与fortran的混合编程
scoot
[专家分:30] 发布于 2008-03-28 23:33:00
各位大侠:
小弟想实现在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个回复)
沙发
tanchuhan [专家分:15140] 发布于 2008-03-29 01:30:00
错误的DLL调用协议
请确定你的DLL导出函数使用__stdcall协议
板凳
scoot [专家分:30] 发布于 2008-03-29 11:56:00
谢谢你能帮我看着问题!但麻烦你能详细指点一下不?是我编的的那个程序的问题还是编程软件问题啊?
3 楼
tanchuhan [专家分:15140] 发布于 2008-03-30 02:03:00
照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 楼
scoot [专家分:30] 发布于 2008-03-31 11:13:00
多谢!我已解决此类问题。非常感谢你的帮助!以后我要还有其他问题的话,希望你能多加指点指点我啊。。。
5 楼
qifang [专家分:0] 发布于 2008-04-07 19:23:00
你好,希望发帖人还能关注
我也遇到和你类似的问题了,能否告诉我你的经验啊?
希望你能帮助我,谢谢
6 楼
scoot [专家分:30] 发布于 2008-04-08 01:19:00
你好!那我就给你讲讲我怎么解决我那个问题的吧。
要想在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 楼
老大徒伤悲 [专家分:29120] 发布于 2008-04-08 08:09:00
虽然我不用,但我还是在这里称赞楼主!
能在问题及绝后和大家分享心得,实在难得。
给予嘉奖!
8 楼
qifang [专家分:0] 发布于 2008-04-08 13:41:00
多谢
我在收到你回复之前,又改动了一下,结果一点击运行VB就出错自动关闭了,这是为什么呢?
我用的是6.5版本的Fortran。
“[color=0000FF]在你开始生成的dll工作空间中,有一个子程序(这是一个调用的声明文件,仔细看看,就能找到这个声明语句,或者,你有很多子程序的话,吧你第一个子程序复制到这个声明文件中也行)[/color]”
不是太明白,我是直接给的路径到*.dll文件的
还要麻烦你一下了,我调用Fortran是要实现输入几个参数后,返回一个数组的功能。请问有什么要特别注意的吗?
9 楼
scoot [专家分:30] 发布于 2008-04-08 15:28:00
你好!你说的这个功能我没用过。但你可以现在fortran程序里头把所要输出得数组放到dat文件中,然后由vb来读取就行了。我最近也是这样做的。
10 楼
scoot [专家分:30] 发布于 2008-04-08 15:34:00
非常感谢“老大徒伤悲”的赞赏,其实我的问题是大家解决出来的。我再返还给所需要用的人也是应该的!呵呵。。。同时我也希望这个版能够越办越好,希望今后会有更多的人站出来,大家可以一起相互交流,这才是一大幸事!
我来回复