假设我已经一段要运行的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分再谢。

解决方案 »

  1.   

    请问你用什么方式运行vbs代码,如果是用那个script控件,你可以在你的VB代码中,把DoEvents封装为一个函数,通过script控件的接口供vbs调用的啊
      

  2.   

    我直接createobject了 还真没想到也从来没用过script控件
    谢谢 我先学习一下那个东东
    另 vbs真的写不出来doEvents吗?
      

  3.   

    MSDN上写的不大明白啊 请问怎么封装Doevents?又怎么被没太看明白vbscript调用?
      

  4.   

    '窗体上添加 1 个 ScriptControl、2 个 CommandButton
    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
      

  5.   

    按道理 从外部是无法结束一个循环的 只在汇编语言中 可以修改IP值LZ 不妨看这里,解释执行vbs代码,可以实现任何功能http://blog.csdn.net/prsniper/archive/2010/08/14/5811251.aspxDoEvents 也可以加入其中,有什么想法可以交流啊
      

  6.   

    封装doevents函数是可行的
    功能已实现多谢bcrun老师指点下面再请教一下 如何强行终止一段正在运行的vbs?
    没找到这个属性或方法
    有代码运行时直接set sc=nothing vb会崩溃
      

  7.   

    谢谢 您的给代码
    关键是vb运行的vbs代码不是“我写” 而是“用户”自己根据需要来写(用户主要使用一些定制的脚本 不排除它自己修改一下的可能)
    所以我们在这里要假定vbs代码里没有主动跳出循环的机制 
    当然我可以在代码强行插入一段条件跳出代码 但我如何知道用户的循环式for next 还是do loop?
    最怕他用 for i=   next i之类的语法所以 现在需要解决的是在 “必要时强行中断vbs运行”
      

  8.   


    同一个线程中,有代码运行时,怎么可能执行到你写的这VB语句呢.哦,对了,是因为你前面在vbs里调用了封装的DoEvents的原因吧.如是那可再想想办法.对了,这个ScriptControl有个Timeout属性,在有些情况下可以派上用场.
      

  9.   

    没有规矩不成方圆。
    你完全可以要求用户必须在自己的脚本中加入 CheckBreak() 调用并主动终止。
    比如你直接将电脑主板不通过变压器直接接到200V电路上导致损坏,电力局不必负责。
      

  10.   

    其实按我的理解,他说想要在vbs中能调用的封装了DoEvents功能的函数,就是类似你说的CheckBreak()吧
      

  11.   

    bcrun老师 麻烦您给写个提取所有For Next和do Loop中间字符串的正则代码吧
    那样 我就可以解决这个难题了
    另:TimerOut在代码运行过程中无法设置
      

  12.   

    经过反复测试 还是没有找到中断scriptcontrol运行的方法 
    如果不能停止vbs运行 前面的努力就都白费了
    郁闷既然vbscript 可以直接quit
    难道scriptcontrol就没有办法了吗???
      

  13.   

    Re: "另:TimerOut在代码运行过程中无法设置",在一开始就设置好嘛:)你说的WScript.Quit (1);
    我没用过,不过就算能用这个,你用户写的代码在循环中执行时你也无法调用Quit吧
      

  14.   

    To bcrun:
    经过各位老师的指点 我已经找到中断vbs运行和判断scriptcontrol状态的的方法了
    还剩一个问题了 因为我不会用正则 不知道正则是否可以直接筛选出所有符合某些特征的字符串
    比如在for ....... next中间的部分
    如果可以
    想麻烦您给写段简单的代码 
    就是从text1.text里筛选出do loop/for next等几种循环体中间的代码
      

  15.   

    好啊,那你现在是打算怎么"中断运行"和"判断状态"的呢我没用正则做过计算机语言的处理,对一起基本的需要处理的地方算法不清楚,比如你这里判断for ....... next中间的部分,至少要考虑这中间还可能有字符串里含有"next"的情况啦,还有for结构嵌套的.对了,用正则做计算机语言语法的分析应该也是很粗略的吧,所以好像只用在象语法高亮这种要求不高的场合.正式的还是应该按部就班的做词法分析,句法分析什么的.
      

  16.   


    '引用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
      

  17.   

    经过不断的测试 终于明白了 如果想中断vbs的运行 只能从vbs的内部去做 否则 vb就会崩溃
    由于使用了封装的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不知我上面做的是否正确 是否有隐患 请大家评判一下