动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Visual Basic教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Visual Basic教程 ]的信息

本月文章推荐
.VisualBasic控件的使用二.
.使用ADO來压缩或修复MicrosoftAc.
.在VisualBasic中判断Windows9x的.
.制造出透明的窗体(Form).
.提高VisualBasic访问数据库效率.
.VB环境下压缩数据流播放技术.
.如何对字符串进行加密解密.
.在VB程序中通过回收站删除文件.
.VB调用API函数使窗口保持在最上层.
.插入对象.
.编写快速高效的VB程序.
.WindowsAPI的作用及使用技巧.
.VisualBasic程序设计.
.用VisualBasic设计个性化文件夹图.
.用VB5.0设计能适应各种显示属性下.
.获得Windows的临时文件的路径.
.使用文件的默认的打开方式.
.一些字符串操作的问题和回答.
.VB中使窗体右上角的X按钮失效.
.利用VisualBasic设计多媒体应用程.

使用Shell指令具有Wait的功能

发表日期:2006-2-27 |


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->

上一篇:如何使用文件复制对话框 人气:3415
下一篇:ADO设定独占性的资料库 人气:2805
浏览全部Visual Basic的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-12-2 OpenPNE中文 v2.12.5 for win 中
2008-12-2 谷秋精品课程软件课程版 v2.3
2008-12-2 晴天电影系统(带一键迅雷/自定义
2008-12-2 QQip138闪字程序
2008-12-2 SmartWeb企业智能建站系统 v1.0.2
2008-12-2 梦想不死个人主页 v2009
2008-12-2 开良ASP小偷程序生成器 v1.1
2008-12-2 toolxp.cnalexa世界排名查询 php
2008-12-2 腾讯留言板 v1.3
2008-11-29 Tencent Traveler 4.4
2008-11-29 龙卷风网络收音机 v3.0.0.0
2008-11-29 Intel Chipset Software Install
2008-11-29 TweakVI 1.0 Build 1100
2008-11-29 Opera 9.62 Build 10469
2008-11-29 MPlayer WW编译版 SVN-r28044(20
2008-11-29 NetTools网络工具v1.0.0破解版
2008-11-29 3DGallery三维体验1.1破解版
2008-11-29 SecretBook保密本v1.0破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | OPEN参数生成器 | 弹出式窗口代码产生器 | 密码登录生成器 | 在线按钮生成器 | Meta标签生成器 | 多色彩特效字代码生成器 | 网页代码调试器 | 在线FTP登陆 | Flash取色器 | 配色代码对照表 | 配色辞典 | CSS生成器 | 广告代码 | 框架网页代码生成器 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | 在线调色板 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 元素周期表 | 健康查询 | 世界时间 | 万年历 | 二十四节气 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2009 www.knowsky.com All rights reserved | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵
SEO対策 中国語教室 ホームページ作成