子程序运行结束,画面关闭,但进程不结束?

kevenquwei 2008-06-27 03:27:42
小弟做的程序是有个主程序运行,通过主程序调用子程序,传递一些参数。例如:
box.exe运行后,监视进程是否结束,监测到结束后把DifficultLevel+1后继续打开运行

下面是主程序的调用过程
Private Sub RunShell(cmdline As String)
Dim hProcess As Long
Dim ProcessId As Long
Dim ExitCode As Long
ProcessId = Shell(cmdline, 1)
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, ProcessId)
Do
Call GetExitCodeProcess(hProcess, ExitCode)
Sleep 1
DoEvents
Loop While ExitCode = STATUS_PENDING
Call CloseHandle(hProcess)
End Sub

通过下面这句调用相应子程序,通过传递不同的DifficultLevel以打开不同难度的游戏程序
RunShell (App.Path & "\exercises\box\box.exe " & DifficultLevel)

现在程序基本运行正常,就是有个问题已经困扰了我很久:

该程序在个别机器上(xp系统),当子程序(如:box.exe)运行结束后,程序运行画面消失,但是在进程中依然存在,所以主程序无法监测到子程序已经运行结束(需要手工结束进程),同一个子程序也不是每一次都出现这样的问题,但还是有时候会出现,很奇怪。
还往各位前辈帮帮小弟,先行感谢了!
...全文
141 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
kevenquwei 2008-06-29
  • 打赏
  • 举报
回复
谢谢楼上各位高手!
a5878431 2008-06-28
  • 打赏
  • 举报
回复
哈哈哈,这个问题好像我曾经也遇到过,你肯定在写“子程序”的代码时,隐藏了某个窗口而不是卸载它,所以出现了这种问题。
解决方法是:在退出“子程序”的主界面时,执行unload 方法卸载隐藏的那个窗口就行。
嗷嗷叫的老马 2008-06-28
  • 打赏
  • 举报
回复
哈哈,对了,还有个治标不治本的方案~~~

那就是在PID有的情况下,再检测主窗体~~

反正你SHELL后有PID了是吧.

然后EnumWindows得到其主窗体句柄,同时检测这两个条件.

如果窗体句柄无效了,就证明被关闭了呗~~~
红叶哥 2008-06-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 myjian 的回复:]
哈哈,对了,还有个治标不治本的方案~~~

那就是在PID有的情况下,再检测主窗体~~

反正你SHELL后有PID了是吧.

然后EnumWindows得到其主窗体句柄,同时检测这两个条件.

如果窗体句柄无效了,就证明被关闭了呗~~~[/Quote]

同意

不過你在子程序的unload 中,加上end 試試
kevenquwei 2008-06-27
  • 打赏
  • 举报
回复
感谢楼上各位朋友的回复!
那么再请问下:一般什么情况下无法完全释放呢?谢谢
东方之珠 2008-06-27
  • 打赏
  • 举报
回复
同意楼上意见!
yangao 2008-06-27
  • 打赏
  • 举报
回复
一般是子程序的问题
个别情况下无法完全释放
嗷嗷叫的老马 2008-06-27
  • 打赏
  • 举报
回复
从你的子程序上找原因吧

为什么它不能正常退出.
nonplus 2008-06-27
  • 打赏
  • 举报
回复
关闭一下进程

如果是WIN and vista
taskkill /pid Num
or
taskkill /im name.exe
游子 2008-06-27
  • 打赏
  • 举报
回复
在关闭的时候也关闭一下进程就可以了。

7,789

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧