假设我已经一段要运行的vbs代码 里面是个死循环
在vb我要运行它方案1 准备用shell来直接运行 这样在必要时干掉它比较容易 但如果代码有错 难以在vb中接收到错误信息(无法调试代码)
方案2 在vb中直接运行vbs 这样很容易在vb中接收到错误信息(可直接调试)但一旦进入了循环 我就不知道该怎么停止它了。
(vbs没有doevents)
我准备使用方案2,因此求助终止vbs循环的办法。
另:
1 手动杀进程的办法不必说
2 多线程的办法也不要 因为没法在vb中调试 (一旦vbs代码有错 vb会崩溃的)
3 最欢迎的是实现DoEvents的vbs函数 或vb6中使用timer????或其他办法 思路也好(timer我没弄成,一旦进入vbs循环 就无法接受终止命令)先谢待
待问题解决加200分再谢。
在vb我要运行它方案1 准备用shell来直接运行 这样在必要时干掉它比较容易 但如果代码有错 难以在vb中接收到错误信息(无法调试代码)
方案2 在vb中直接运行vbs 这样很容易在vb中接收到错误信息(可直接调试)但一旦进入了循环 我就不知道该怎么停止它了。
(vbs没有doevents)
我准备使用方案2,因此求助终止vbs循环的办法。
另:
1 手动杀进程的办法不必说
2 多线程的办法也不要 因为没法在vb中调试 (一旦vbs代码有错 vb会崩溃的)
3 最欢迎的是实现DoEvents的vbs函数 或vb6中使用timer????或其他办法 思路也好(timer我没弄成,一旦进入vbs循环 就无法接受终止命令)先谢待
待问题解决加200分再谢。
解决方案 »
- 请问有没有办法使Byte型数组转换成long型数组
- 关于控制其他软件
- VB6.0+OO4O+pl/sql+调用存储过程=不会!
- 如何创建表格啊?就是说如果在数据库中有了该表格就不创建,如果没有这个表名,那么就创建??急!
- 老问题,但是我怎么都不成功,希望得到帮助!Internet上进行TCP协议文件传输问题,详细请进本帖看!
- 请问怎样才能获得服务器端的时间
- 各位高手朋友,小弟不得不再麻烦您一次了,能否再帮小弟一把?? (附带感谢 mjcom(风声水起)上次对我的帮助)
- 求高效足彩缩水覆盖VB算法
- 谁能告诉我到哪儿下个水晶报表的控件?或有人愿意给个我么?多谢了
- 关于菜单的控件
- 各位大侠一定要帮帮忙啊!很多方法都搞不定
- 用setup factory打包的VB程序,安装时失败
谢谢 我先学习一下那个东东
另 vbs真的写不出来doEvents吗?
Option ExplicitPrivate m_bBreak As BooleanPublic Function CheckBreak() As Boolean
DoEvents
CheckBreak = m_bBreak
End FunctionPrivate Sub Command1_Click()
Dim sScript As String
sScript = Join(Array("Sub f()", _
" Dim i", _
" Do While True", _
" If Form1.CheckBreak Then Exit Do", _
" i = i+1", _
" Loop", _
" MsgBox i", _
"End Sub" _
), vbCrLf)
m_bBreak = False
With ScriptControl1
.Reset
.Language = "vbscript"
.AddObject "Form1", Me
.AddCode sScript
.ExecuteStatement "call f()"
End With
End SubPrivate Sub Command2_Click()
m_bBreak = True
End Sub
功能已实现多谢bcrun老师指点下面再请教一下 如何强行终止一段正在运行的vbs?
没找到这个属性或方法
有代码运行时直接set sc=nothing vb会崩溃
关键是vb运行的vbs代码不是“我写” 而是“用户”自己根据需要来写(用户主要使用一些定制的脚本 不排除它自己修改一下的可能)
所以我们在这里要假定vbs代码里没有主动跳出循环的机制
当然我可以在代码强行插入一段条件跳出代码 但我如何知道用户的循环式for next 还是do loop?
最怕他用 for i= next i之类的语法所以 现在需要解决的是在 “必要时强行中断vbs运行”
同一个线程中,有代码运行时,怎么可能执行到你写的这VB语句呢.哦,对了,是因为你前面在vbs里调用了封装的DoEvents的原因吧.如是那可再想想办法.对了,这个ScriptControl有个Timeout属性,在有些情况下可以派上用场.
你完全可以要求用户必须在自己的脚本中加入 CheckBreak() 调用并主动终止。
比如你直接将电脑主板不通过变压器直接接到200V电路上导致损坏,电力局不必负责。
那样 我就可以解决这个难题了
另:TimerOut在代码运行过程中无法设置
如果不能停止vbs运行 前面的努力就都白费了
郁闷既然vbscript 可以直接quit
难道scriptcontrol就没有办法了吗???
我没用过,不过就算能用这个,你用户写的代码在循环中执行时你也无法调用Quit吧
经过各位老师的指点 我已经找到中断vbs运行和判断scriptcontrol状态的的方法了
还剩一个问题了 因为我不会用正则 不知道正则是否可以直接筛选出所有符合某些特征的字符串
比如在for ....... next中间的部分
如果可以
想麻烦您给写段简单的代码
就是从text1.text里筛选出do loop/for next等几种循环体中间的代码
'引用Microsoft VBScript Regular Expressions 5.5
Private Sub Command1_Click()
Text2 = TestRegExp("do[\w\W]*loop", Text1)
End SubFunction TestRegExp(myPattern As String, myString As String)
''Create objects.
Dim objRegExp As RegExp
Dim objMatch As Match
Dim colMatches As MatchCollection
Dim RetStr As String
'' Create a regular expression object.
Set objRegExp = New RegExp
''Set the pattern by using the Pattern property.
objRegExp.Pattern = myPattern
'' Set Case Insensitivity.
objRegExp.IgnoreCase = True
''Set global applicability.
objRegExp.Global = True
''Test whether the String can be compared.
If (objRegExp.Test(myString) = True) Then
''Get the matches.
Set colMatches = objRegExp.Execute(myString) '' Execute search.
For Each objMatch In colMatches '' Iterate Matches collection.
RetStr = RetStr & objMatch.Value & vbCrLf
Next
Else
RetStr = "String Matching Failed"
End If
TestRegExp = RetStr
End Function
由于使用了封装的doevents函数 vbs就可以接受vb6发出中断命令了
在vbs中加入一个模块 让vbs运行转到到其中一个空函数中,vbs就停止了 只是在vb6中也可以Set sc=nothing了由于 vbscriptcontrol在运行时 多数属性 都是只读的
所以我使用了错误陷阱判断vbs状态
Function IsVBSRunning()
on error goto scErr
set Sc.timeOut=-1
exit function
scErr:
End Function不知我上面做的是否正确 是否有隐患 请大家评判一下