电信主站 网通分站
购买流程 付款方式 常见问题 在线提问 续租服务 购物车
用户名: 密 码: 忘记密码?
首 页
域名注册
虚拟主机
双线主机
服务器租用
VPS主机
企业邮局
代理专区
客服中心
虚拟主机行业资讯 虚拟主机评测对比 互联网最新动态 技术学院 站长资讯 在线教程 网站运营
搜索优化 服务器 网络编程 图形图象 站长之家 网页制作 操作系统
冲浪宝典 软件教学 视频通信 办公软件 邮件系统 网络安全 认证考试
您当前位置:西部数码->资讯中心-> 邮件系统
使用shell指令具有wait的功能_visualbasic教程
作者:网友供稿 点击:0
  西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!虚拟主机可在线rar解压,自动数据恢复设置虚拟目录等.虚拟主机免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金!
文章页数:[1] 
VB中,常以Shell指令来执行外部程式,然而它在Create该外部process後,立刻
就会回到vb的下一行程式,无法做到等待该Process结束时,才执行下一行指令,
或是说,无法得知该Process是否已结束,甚者,该Process执行到一半,又该如何
中止其执行等等,这些都不是Shell指令所能控制的,因此我们需使API的帮助来完
成。

第一个问题,如何等待shell所Create的process结束後才往後执行vb的程式。
首先要知道的是,每个Process有唯一的一个ProcessID,这是OS给定的,用来
区别每个Process,这个ProcessID(PID)主要可用来取得该Process相对应的一些
资讯,然而要对该Process的控制,却大多透过ProcessHandle(hProcess)。VB
Shell指令的传回值是PID,而非hProcess,所以我们需透过OpenProcess这个API来
取得hProcess而OpenProcess()的第一个叁数,指的是所取得的hProcess所具有的
能力,像PROCESS_QUERY_INFORMATION便是让GetExitCode()可取得hProcess所指
的process之状态,而PROCESS_TERMINATE,便是让TerminateProcess(hProcess..)
的指令能够生效,也就是说,不同叁数设定,使hProcess所具有的权限、能力有所
不同。取得hProcess後便可以使用WaitForSingleObject()来等待hProcess状态的
改变,也就是说,它会等待hProcess所指的process执行完,这个指令才结束,它
第二个叁数所指的是WaitForSingleObject()所要等待的时间(inmilliseconds)
,如果超过所指的时间,就TimeOut而结束WaitForSingleObject()的等待。若要它
无限的等下去,就设定为INFINITE。

pid=Shell("C:\tools\spe3\pe2.exe",vbNormalFocus)
hProcess=OpenProcess(PROCESS_QUERY_INFORMATION,0,pid)
ExitEvent=WaitForSingleObject(hProcess,INFINITE)
CallCloseHandle(hProcess)

上例会无限等待shell指令create之process结束後,才再做後面的vb指令。有
时觉得那会等太久,所以有第二个解决方式:等process结束时再通知vb就好,即
:设定一个公用变数(isDone),当它变成True时代表Shell所Create的Process已结
束。当Process还在执行时,GetExitCodeProcess会传&H103给其第二个叁数,直到
结束时才传另外的数值,如果程式正常结束,那Exitcode=0,否则就得看它如何
结束了。或许有人在其他地方看到loop的地方是LoopwhileExitcode<>0,那
有一点危险,如果以这程子来看,您不是用F4来离开pe2而是用右上方X的结束
doswindow那麽,会因为ExitCode的值永远不会是0,而进入无穷的回圈。

DimpidAsLong
pid=Shell("C:\tools\spe3\pe2.exe",vbNormalFocus)
hProcess=OpenProcess(PROCESS_QUERY_INFORMATION,0,pid)
isDone=False
Do
CallGetExitCodeProcess(hProcess,ExitCode)
Debug.PrintExitCode
DoEvents
LoopWhileExitCode=STILL_ALIVE
CallCloseHandle(hProcess)
isDone=True

另外,如果您的shell所Create的程式,有视窗且为立刻Focus者,可另外用以
下的方式DimpidAsLong
Dimhwnd5AsLong
pid=Shell("c:\tools\spe3\pe2.exe",vbNormalFocus)
hwnd5=GetForegroundWindow()
isDone=False
DoWhileIsWindow(hwnd5)
DoEvents
Loop
isDone=True



而如何强迫shell所Create的process结束呢,那便是
DimaaAsLong
IfhProcess<>0Then
aa=TerminateProcess(hProcess,3838)
EndIf

hProcess便是先前的例子中所取得的那个ProcessHandle,3838所指的是传给
GetExitCodeProcess()中的第二叁数,这是我们任意给的,但最好不要是0,因为
0一般是代表正常结束,当然这样设也不会有错。当然不可设&H103,以这个例子来
看,如果程式正处於以下的LOOP
Do
CallGetExitCodeProcess(hProcess,ExitCode)
Debug.PrintExitCode
DoEvents
LoopWhileExitCode=STILL_ALIVE
Debug.printExitCode

而执行了TerminateProcess(hProcess,3838)那会看到ExitCode=3838。然
而,这个方式在win95没问题,在NT中,可能您要在OpenProcess()的第一个叁数要
更改成PROCESS_QUERY_INFORMATIONOrPROCESS_TERMINATE这样才能Work。不过
良心的建议,非到最後关头,不要使用TerminateProcess(),因不正常的结束,往
往许多程式结束前所要做的事都没有做,可能造成Resource的浪费,甚者,下次再
执行某些程式时会有问题,例如:本人常使用MS-dosShellLink的方式执行一程
式,透过Comport与大电脑的联结,如果Ms-dosShellLink不正常结束,下次再
想Link时,会发现tooManyOpens,这便是一例。

另外,有人使用Shell来执行.bat档,即:
pid=Shell("c:\aa.bat",vbNormalFocus)
可是却遇上aa.bat结束了,但ms-dos的Window却仍活着,那可以用以下的方式来做
pid=Shell("c:\command.com/cc:\aa.bat",vbNormalFocus)
那是执行Command.com,而Command.com指定执行c:\aa.bat而且结束时自动Close
所有程式如下:
PrivateDeclareFunctionOpenProcessLib"kernel32"_
(ByValdwDesiredAccessAsLong,ByValbInheritHandleAsLong,_
ByValdwProcessIdAsLong)AsLong
PrivateDeclareFunctionWaitForSingleObjectLib"kernel32"_
(ByValhHandleAsLong,ByValdwMillisecondsAsLong)AsLong
PrivateDeclareFunctionCloseHandleLib"kernel32"_
(ByValhObjectAsLong)AsLong
PrivateDeclareFunctionGetExitCodeProcessLib"kernel32"_
(ByValhProcessAsLong,lpExitCodeAsLong)AsLong
PrivateDeclareFunctionTerminateProcessLib"kernel32"_
(ByValhProcessAsLong,ByValuExitCodeAsLong)AsLong
PrivateDeclareFunctionGetForegroundWindowLib"user32"()AsLong
PrivateDeclareFunctionIsWindowLib"user32"_
(ByValhwndAsLong)AsLong

ConstPROCESS_QUERY_INFORMATION=&H400
ConstSTILL_ALIVE=&H103
ConstINFINITE=&HFFFF

PrivateExitCodeAsLong
PrivatehProcessAsLong
PrivateisDoneAsLong
PrivateSubCommand1_Click()
DimpidAsLong
pid=Shell("C:\tools\spe3\pe2.exe",vbNormalFocus)
hProcess=OpenProcess(PROCESS_QUERY_INFORMATION,0,pid)
isDone=False
Do
CallGetExitCodeProcess(hProcess,ExitCode)
Debug.PrintExitCode
DoEvents
LoopWhileExitCode=STILL_ALIVE
CallCloseHandle(hProcess)
isDone=True
EndSub

PrivateSubCommand2_Click()
DimpidAsLong
DimExitEventAsLong
pid=Shell("C:\tools\spe3\pe2.exe",vbNormalFocus)
hProcess=OpenProcess(PROCESS_QUERY_INFORMATION,0,pid)
ExitEvent=WaitForSingleObject(hProcess,INFINITE)
CallCloseHandle(hProcess)
EndSub

PrivateSubCommand3_Click()
DimaaAsLong
IfhProcess<>0Then
aa=TerminateProcess(hProcess,3838)
EndIf

EndSub

PrivateSubCommand4_Click()
DimpidAsLong
Dimhwnd5AsLong
pid=Shell("c:\tools\spe3\pe2.exe",vbNormalFocus)
hwnd5=GetForegroundWindow()
isDone=False
DoWhileIsWindow(hwnd5)
DoEvents
Loop
isDone=True
EndSub

PrivateSubCommand5_Click()
DimpidAsLong
pid=Shell("c:\windows\command\xcopyc:\aa.bata:",vbHide)
pid=Shell("c:\command.com/cc:\aa.bat",vbNormalFocus)
EndSub->


文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
相关主题
文章页数:[1] 
Google
热门文章
·用photoshop蒙板给灰暗的照片调色_photoshop教程
·彩虹初现 photoshop设计奇幻风格的壁纸_photoshop教程
·photoshop蒙板全攻略_photoshop教程
·教你用photoshop绘制诱人的哈密瓜_photoshop教程
·photoshop婚纱照片处理及美化_photoshop教程
·ubuntu下安装php5+pdo_php教程
·photoshop古铜色效果制作方法_photoshop教程
·photoshop可选色与蒙板打造偏色人像艺术特效_photoshop教程
·photoshop制作网站流程图解揭密_photoshop教程
·photoshop绘制矢量风格美女插画_photoshop教程

最新文章
·分析邮件服务器发送海外不成功的原因
·尴尬的被告:谁为电子邮件安全买单
·专家浅析海外邮件收发不成功的原因
·深度剖析:中小网络公司经营之谜局
·企业是否需要企业邮局 有什么好处?
·重新审视:从道德视角看邮件泄露案
·走进反垃圾邮件研究 透视最新技术动向
·如何预防和减少“垃圾邮件”的到来
·华南双线IDC能否突破南北互联瓶颈?
·IDC邮件安全网关方案提高带宽效率


 
 


版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!

特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
  打印  刷新  关闭
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 虚拟主机 | 资讯中心 | 友情链接 | 网站地图

版权所有 西部数码(www.west263.com)
CopyRight (c) 2002~2006 west263.com all right reserved.
公司地址:四川成都市万和路90号天象大厦4楼 邮编:610031
电话总机:028-86262244 86263048 86263408 86263960 86264018 86267838
售前咨询:总机转201 202 203 204 206 208
售后服务:总机转211 212 213 214
财务咨询:总机转224 223 传真:028-86264041 财务QQ:点击发送消息给对方635483282
售前咨询QQ:点击发送消息给对方2182518 点击发送消息给对方241975952 点击发送消息给对方275026793 点击发送消息给对方408235859
售后服务QQ:点击发送消息给对方17708515 点击发送消息给对方307742704 点击发送消息给对方287976517 点击发送消息给对方363783715
《中华人民共和国增值电信业务经营许可证》编号:川B2-20030065号