主题:[讨论]vb调用fortran的DLL
seais1314
[专家分:0] 发布于 2011-03-24 22:32:00
第一次用VB调用一个FORTRAN动态链接库,老出错!而且还先用一个非常简单的程序进行测试!
总是找不到入口点!真的有点绝望了,贴子看N多,中文的,英文的。。。
试了N多方法!还是不行,要准备跳楼的时候,奇迹发生了!
行了!突然有种想哭的冲动。。。喜极而泣
两天来一直在搞这个,啥也没搞!幸好运行成功了!
大家有经验的交流一下呀!交流一下为什么老出错?我出错的主要原因应该是按值和地址传输出错了!
我的软件版本是 Microsoft.Visual.Studio.2005.简体中文正式版
Intel.Visual.Fortran.Compiler.Professional.v11.1.038
我在想:是不是软件版本比VB6.0与其它版本的FORTRAN编译器要高,有些语言规则变了,按着相同的方法就没办法进行调用了?或者新旧版本有什么区别,望请专家指教!
谁有系统一点的资料分享一下呀!
[em2]
回复列表 (共13个回复)
11 楼
米果88 [专家分:0] 发布于 2011-04-21 10:03:00
你好,最近也在学习利用VB调用Fortran编好的DLL程序,也是出现你说的那个问题,在声明中检查了许久,一直没有找到问题所在。我用的是CVF6.6和VB6.0,也是出现找不到入口节点,如果在声明中添加Private,运行时会出现子程序或函数未定义。希望各位高手帮忙解决,再次非常感谢,因为这个问题一直困扰我很久了。
下面是程序代码:
subroutine wellparameter (d1,Y)
! DEC $attributes alias:'wellparameter'::wellparameter
! DEC $attributes dllexport :: wellparameter
PARAMETER (N=4)
DIMENSION Y(N)
real d1
pwh=29*10**6
qd=24*10**4.0
t0=66
rg=0.599
pi=3.1415
R=8315
qmol=29*rg
d=d1/1000
pc=(4.7781-0.2482*rg)*10**6
tc=92.2222+176.6667*rg
Y(3)=pwh
Y(4)=t0
pr=Y(3)/pc
tr=(Y(4)+273)/tc
Zg=1
Do 100 i1=1,5
denr=0.27*pr/(Zg*tr)
y1=(0.31506-1.0467/tr-0.5783/tr**3.0)*denr
y2=(0.5333-0.6127/tr+0.6185/tr**3.0)*denr**2.0
Zg=1.0+y1+y2
100 CONTINUE
dens0=qmol*Y(3)/(R*(Y(4)+273)*Zg)
v0=(qd/86400)*((Y(4)+273)/293)*(0.101/(Y(3)/10**6))*Zg*4/pi*(1.0/d**2.0)
Y(2)=v0
Y(1)=dens0
end subroutine wellparameter
VB代码是:
Private Declare Sub wellparameter Lib "E:\wellparameter.dll" (d1 As Single, y As Single)
Private Sub Command1_Click()
Dim d1 As Single
Dim y(1 To 4) As Single
d1 = Val(txtInput.Text)
Call wellparameter(d1, y(1))
txtOutput1.Text = y(1)
txtOutput2.Text = y(2)
txtOutput3.Text = y(3)
txtOutput4.Text = y(4)
End Sub
Private Sub Command2_Click()
End
End Sub
我怀疑是不是编译器之间的链接有问题,还是有些调用之间的规则还不了解,我也看过很多人写的期刊论文,可按照人家上面的示例去编,依然还是有这种情况,不过我对这个问题还是有信心,相信我们能够把它解决了,先谢谢你们!
12 楼
cgl_lgs [专家分:21040] 发布于 2011-04-21 10:39:00
用depend程序打开那个dll看看是否成功导出了:)
13 楼
dongyuanxun [专家分:7180] 发布于 2011-04-21 11:07:00
11l没按语法规则写当然不能成功导出了
! DEC $attributes alias:'wellparameter'::wellparameter
! DEC $attributes dllexport :: wellparameter
改为
!DEC$ attributes alias:'wellparameter'::wellparameter
!DEC$ attributes dllexport :: wellparameter
不知道你$后面紧跟attributes想干啥
我来回复