标题: VBS真的能实现多线程?
作者: Demon
链接: https://demon.tw/programming/vbs-multi-thread.html
版权: 本博客的所有文章,都遵守“署名-非商业性使用-相同方式共享 2.5 中国大陆”协议条款。
今天在批处理之家看到一个帖子《vbs多线程下载》,想起以前在VBS吧也看过《多线程下载文件》,当时我就质疑这到底是不是多线程,今天正好研究一下VBS是否真的能实现多线程。
DownloadFile "http://www.baidu.com","baidu.txt" DownloadFile "http://www.sohu.com","sohu.txt" DownloadFile "http://www.sina.com.cn","sina.txt" MsgBox "请等待下载完成..."&Space(20),0,"多线程下载 By 次碳酸钴" Sub DownloadFile(s,n) c="Set h0=CreateObject(""Microsoft.XMLHTTP"")"&VbCrLf c=c&"Sub th0"&VbCrLf c=c&"If h0.ReadyState=4 Then SaveToFile h0.ResponseBody,""fn"""&VbCrLf c=c&"End Sub"&VbCrLf c=c&"h0.OnReadyStateChange=GetRef(""th0"")"&VbCrLf c=c&"h0.Open ""GET"",""url"",True:h0.Send"&VbCrLf c=Replace(c,"0",Rnd*1E15):c=Replace(c,"fn",n):c=Replace(c,"url",s): ExecuteGlobal c End Sub Sub SaveToFile(a,b) On Error Resume Next:Err.Clear With CreateObject("ADODB.Stream") .Type=1:.Mode=3:.Open .Write a If Err.Number Then Msgbox b&" 下载失败!":Exit Sub .SaveToFile b If Err.Number Then Msgbox b&" 文件保存失败或文件已存在!":Exit Sub Msgbox b&" 下载完成!" End With End Sub
用OllyDbg载入wscript.exe,bp CreateThread和NtCreateThread函数,F9运行,根本没有被断下来,也就是说,根本没有创建新的线程。
我曾经也写过一篇《VBS实现“多线程”》(注意我的“多线程”加了双引号):
Dim IE Set IE = CreateObject("InternetExplorer.Application") IE.Navigate "about:blank" Set window = IE.Document.parentWindow id = window.setTimeout(GetRef("on_timeout"),3000,"VBScript") name = InputBox("Please enter your name","InputBox Timeout") window.clearTimeout id If name <> "" Then MsgBox "Hello," & name IE.Quit 'By Demon 'https://demon.tw Sub on_timeout() Dim WshShell set WshShell = CreateObject("wscript.Shell") WshShell.SendKeys "{ESC}" End Sub
很遗憾,用OllyDbg调试的结果和上面的一样,根本没有用CreateThread函数创建新线程。
但是如果你观察OllyDbg的线程窗口,会发现会有新的线程创建,这是怎么回事呢?事实上,Windows程序大多数都是多线程的,即使程序没有主动去创建线程。(Most Win32 applications are really multithreaded, even if they don’t know it)如果不是CreateThread创建的线程,那很有可能是系统为完成某些工作而创建的线程,不属于用户代码。以上面的VBS多线程下载为例,异步请求的内部应该调用了某些异步IO的API,而这些API为了实现异步的功能可能会创建新的进程。
所以VBS是否能实现多线程,得看你从哪个角度来看,如果从系统角度来看,它的确使用了多线程(切,谁不是呢);如果从用户的角度看,它并没有创建新的线程。
但是一般意义上的多线程指的是程序主动去创建的,个人认为上面的VBS不属于多线程。
赞赏微信赞赏支付宝赞赏
随机文章:
老哥 我爱你
这个是异步吧?