如何知道VB调用的外部程序已经结束运行

如图,我打算用VB编制这个优化程序。
用shellexecute调用NASTRAN.EXE程序,调用如下ShellExecute(ME.HWND, "D:\nastran.exe", "w.bdf", NULL,SW_SHOWNORMAL)
但后来发现一个问题,就是在NASTRAN.EXE没有执行完成的时候所编制的程序已经向下走了。导致对同未被修改的W.bdf 同时重复多次被调用。
有什么办法让 nastran.exe 执行完成后才运行ShellExecute的下一个语句。

可以使用while循环查看是否结束
Private Function MyShell(ByVal cmd As String, Optional AppStyle As VbAppWinStyle = vbNormalFocus)
Dim RetVal As Long
RetVal = Shell(cmd, AppStyle)
Do While IsRunning(RetVal)
DoEvents
Loop
'执行完毕
End Function
调用!!!
MyShell "c:\1.exe", vbHide
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-04-22
兄弟,你的nastran是完成后是否会自动结束自己的?如是的话就用判断进程法。
如不是,就用判断文件法,即判断w.bdf是否已经被改动。
然后设一个超时判断就ok啦。
第2个回答  2011-04-22
你不是运行结束有文本文件输出吗?调用外部文件后,一直就检测文本文件有没有生成,有的话再下一步,没有的话延时再判断,一直到有文件生成!
第3个回答  2011-04-22
可以使用子进程的方式。《windows核心编程》中4.4节就提到了这个方法,你可以参考一下。
第4个回答  2011-04-22
判断进程是否存在,存在的话结束进程就可以了

VB如何确定外部应用程序的终止
在编写Visual Basic for Windows应用程序时,通常会遇到这样的编程要求,从VB应用程序中调用一外部应用程序,在外部应用程序执行完毕后,再继续执行VB程序.在16位的VB应用程序中通过Shell()函数调用外部应用程序,然后通过使用Windows API询问应用程序的状态,但这样并不是一个十分有效的处理方法.在32位的VB程序...

VB中如何判断某进程已结束,求代码。
方法一:程序a可以启动时生成一个文件,结束后删除该文件,假设该文件为"a.ini"主程序只要 :dir(目录\\a.ini)="" 就证明a退出了.方法二:a程序在ini等其它外部文件中设置标记.主程序读取该标记的值 方法三:枚举进程,网上可以搜到这样的例子.参考资料:http:\/\/www.390du.com\/ba\/show.asp?id=20 ...

如何使用VB监视系统进程
在需要判断的地方调用这个定义的函数,根据返回的值,就可以判断是否运行完毕。返回True表示运行完毕,False,表示还在运行。专家点评:上面的程序运用了OpenProcess函数,可以对于一个已经存在的进程对象返回一个句柄,该函数的声明如下:HANDLE OpenProcess" (DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD d...

vb调用程序并等待其结束
'说明: 1、缺省情况下,Shell是以异步方式(并行)来执行其它程序的,即用 Shell 启动的 ' 程序可能还没有完成执行过程,就已经执行到 Shell 函数之后的语句。' 本函数让用Shell启动的程序同步运行(串行)' 2、等待该程序运行结束后才继续执行以后的语句。'示例: Label1.Caption = "Shell ...

用vb如何简单的结束系统进程
首先需要知道进程的PID 用OpenProcess(1,-1,mProcID)获得了进程句柄mProcID 然后TerminateProcess mProcID,0 就可以结束进程,如果是系统进程的话,个别的结束不了,挂钩OpenProcess和TerminateProcess函数的进程应该也结束不了的。

vb 如何外部立即结束正在运行的子程序?
子过程没法从外部停止,独立进程可以调用windows API实现。VB不可能从外部结束一个sub、function或者循环,只能在这个sub、function和循环内部结束。另外你的程序其实是不工作的,当你按下Command1以后,程序就像死机了一样,command2是按不下去的。VB的sleep是前台独占的,进程不会相应任何东西,包括command2...

VB 中用 openprocess 监控 shell 调用的外部程序报错,求助大家帮忙解决...
我想在vb中用shell调用外部程序"url_and_so.bat" (加参数 "tradingdate"),然后用openprocess取得这个外部程序运行时的process id,再用WaitForSingleObject函数监控这个程序是否完成 但是debug时,系统报错 "Managed Debugging Assistant 'PInvokeStackImb... 展开 匿名...

vb 关闭打开的外部程序。
在timer事件里写 Call taskkill("xx.exe")'如果存在进程xx.exe,则结束xx.exe 在空白处写 Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long Private Declare Function Process32First Lib "kernel32" (ByVal hSnap...

请问怎么让VB、MATLAB知道已经运行了一个实例,使用户不再重复运行
首先把这个程序写成一个函数,函数的输入变量就是你准备在vb中输入的变量。然后把这个函数编译成一个COM组件,用comtool这个东西。最后在vb工程中添加这个组件,然后就可以用使用一般COM组件的方式来使用你的函数了,实际上还是相当于用vb来调用matlab的运行库,因此画图什么的出来也是matlab的效果。 下面将分别讨论Matlab与...

vb 打开\/关闭外部程序问题
打开的话可以shell Shell "目录\/b.exe"关闭程序不大清楚,不过我的想法是。在打开程序时获取程序窗口的句柄,关闭时根据指定句柄去关闭

相似回答