主题:vb和fortran调用的问题
lj1982002
[专家分:430] 发布于 2007-05-04 18:37:00
我没有用dll
我是先把fortran调试通过后,生成exe文件,用vb做界面。把界面输入的结果存在一个文件里,然后vb里面用shell调用fortran的exe文件,exe文件里面包含了从文件里读入。
但是,每次在vb调用exe时,都只是一闪而过,没有运行
如果单独点击exe运行,是可以运行通过的。
我不知道什么原因,请指教,急等
回复列表 (共8个回复)
沙发
mltx [专家分:20880] 发布于 2007-05-04 19:49:00
Windows是分时系统,vb在调用exe后,并不停留在那条语句上,而是执行和处理下一条语句。
要想办法让vb在执行完exe之后再执行后面的语句,这是vb调用exe的关键技术。
这不是fortran的问题了,可能在vb区里能找到满意的解答。
板凳
nosper [专家分:60] 发布于 2007-05-07 15:11:00
有可能 是 路径 的 问题 ,
用 java调用fortran的exe文件 也会 发生 类似 的 情况:
直接 双击 exe文件 ,他可以 运行 ,但是 当被调用 之后 就 没有 结果
在 fortran 里面 他可能 写输入 文件的 时候 用的 是相对 路径 ,所以 当 你把 input文件 和 exe文件放在 一个 file里时,双击 exe是 可以运行 的
但是 当他 被其他 的 程序 调用 的 时候 ,可能 会出现 找不到 input文件的 情况 ,这个时候 ,就是一闪而过 。。。
可以 将 fortran中 的 相对路径 改为绝对 路径
不如 在fortran中 :
1 WRITE (*, '(" Enter input file: ")')
! READ (*,'(A)') file
file = 'rts1.dat'
将 file = 'rts1.dat' 改为 file = 'C:\xxxx\rts1.dat'
问题就解决了
这是 java调用 fortran时 可能会遇到 的 问题 ,我想 vb也应该 和这 个 类似 !
3 楼
nosper [专家分:60] 发布于 2007-05-07 15:17:00
在补充一点:
文件输出路径也要改到 指定 的 文件 夹 里 ,不然 也会 没有 结果
4 楼
htczhy [专家分:470] 发布于 2007-05-08 11:22:00
写如下语句,第一个参数为完整的程序路径和程序名,第二个参数把调用后的焦点赋给所调用的程序。
如:
Call Shell("c:\**.exe", 1)
5 楼
lj1982002 [专家分:430] 发布于 2007-05-10 20:22:00
MTLX老师说的对,是vb的问题,已经解决
我在vb调用了windows等候机制,让程序等候exe程序运行完后,在执行后面的语句,也就是一个循环问题。谢谢各位的意见
6 楼
mltx [专家分:20880] 发布于 2007-05-10 22:35:00
[quote]MTLX老师说的对,是vb的问题,已经解决
我在vb调用了windows等候机制,让程序等候exe程序运行完后,在执行后面的语句,也就是一个循环问题。谢谢各位的意见
[/quote]
正解!
7 楼
nbwwj [专家分:0] 发布于 2007-07-15 13:44:00
我也碰到了.我用了您所说的等待机制,编程如下:
Private Function ExecCmd(cmdline$)
Dim proc As PROCESS_INFORMATION
Dim start As STARTUPINFO
'Initialize the STARTUPINFO structure:
start.cb = Len(start)
'Start the shelled application:
ret& = CreateProcessA(vbNullString, cmdline$, 0&, 0&, 1&, _
NORMAL_PRIORITY_CLASS, 0&, vbNullString, start, proc)
'Wait for the shelled application to finish:
Do
ReturnValue = WaitForSingleObject(proc.hProcess, 0) ' Not necessarily0, you can set a value like 100 as well
DoEvents '在此处等待FOTRAN程序执行完
Loop Until ReturnValue = 0
Call GetExitCodeProcess(proc.hProcess, ReturnValue)
Call CloseHandle(proc.hThread)
Call CloseHandle(proc.hProcess)
ExecCmd = ret&
End Function
现在我要运行"D:\Aermod\Aermet\EX01\stage1n2.exe"这个FOTRAN程序,则调用ExecCmd("D:\Aermod\Aermet\EX01\stage1n2.exe").但程序仍是一闪而过,并不真正执行.
请您能帮我看一下原因吗?万分感谢ing!
8 楼
cranessfg [专家分:0] 发布于 2010-12-20 16:07:00
小弟也是超业余水准,临时派的活,遇到了同样的问题,请教您是怎么解决的,能不能把实现这块程的序给小弟分享一份?万分感谢!!!
我来回复