让VBS支持WithEvents
显然,VBS脚本不支持WithEvents,就算activex dll中设置了raiseevent ,vbs调用时也无法触发。
如果在html和hta用vbs脚本调用activex com,可以实现WithEvents。比如用VB写了一个dll,raiseevent一个事件Report,在hta中这样实现WithEvents
-
<html>
-
<head>
-
<title>HTA蜘蛛</title>
-
</head>
-
<object classid="clsid:942A9C51-90E8-4A52-BDB9-4EC7A87C6D46" id="Spider" width="320" height="320">
-
</object>
-
<body>
-
<script type="text/vbscript">
-
-
Sub Spider_Report(ByVal isErr , ByVal Des )
-
Msgbox Des,,isErr
-
End Sub
-
-
Spider.Start
-
-
</script>
-
</body>
-
</html>
如果在VBS脚本使用wscript.exe作为宿主,可以使用wscript.CreateObject("Spider","Spider_")来绑定Spider_Report这个事件。
如果使用msscript.dll来解析vbs脚本,只能采用其他办法了,比如callback。明晨网络转载一段来自cdns的zhiyongtu的代码
以下为转载,原文地址http://topic.csdn.net/u/20090429/19/2b8faaa1-973c-457b-b0b0-84e9bf364080.html
我查阅了大量资料,始终找不到用标准VB事件处理调用接口实现Script响应Win32程序事件的方法。最后得出的结论是:
VBScript本来就是设计用来与Web文档等活动文档一起工作的,在VBScript中像WithEvents等许多特性都不被支持。所以,要让VBScript来响应Win32程序事件,必须提供额外的接口,基本上就是用Callback方法。
以下为我用Callback方法实现的VBScript事件处理程序:
VB6 ActiveX DLL(工程名:“QTEST”,类模块名:“MyPlugin”):
- VB code
-
Option Explicit
Private ScriptListener As Object
Public Event TestEvent()
Public Function AddHandler(Caller) As Boolean
On Error GoTo AddHandlerError
Set ScriptListener = Caller
AddHandler = True
Exit Function
AddHandlerError:
AddHandler = False
Exit Function
End Function
Public Function RemoveHandler(Caller) As Boolean
On Error GoTo RemoveHandlerError
If ScriptListener Is Caller Then
Set ScriptListener = Nothing
RemoveHandler = True
Else
RemoveHandler = False
End If
Exit Function
RemoveHandlerError:
RemoveHandler = False
Exit Function
End Function
Public Function MyTest(ByVal Number1 As Variant, ByVal Number2 As Variant) As Long
MyTest = Number1 + Number2
RaiseEvent TestEvent
If Not ScriptListener Is Nothing Then ScriptListener.FromEvent MyTest
End Function
WithEvents.vbs:
- VBScript code
-
Class MyEventListener '用于创建事件处理对象的类
Public Sub FromEvent(Value)
Msgbox "事件返回值为:" & Value,,"事件"
End Sub
End Class
'以下注册事件处理程序
Dim EvObj, oListener
Set EvObj = CreateObject("Qtest.MyPlugin")
Set oListener = New MyEventListener
Call EvObj.AddHandler(oListener)
'调用DLL,引起事件调用(Callback)
EvObj.MyTest 3,5
'以下注销事件处理程序,从内存退出
If EvObj.RemoveHandler(oListener) Then
Set EvObj = Nothing
Set oListener = Nothing
Else
Msgbox "注销事件处理程序出错,你需要手工处理!",,"错误"
End If
在VB工程中,为Script提供了两个方法AddHandler、RemoveHandler,用于注册和注销事件处理程序。在EvObj.MyTest调用中,先用RaiseEvent TestEvent调用其它用标准接口绑定的事件处理程序,然后再用Callback方法调用Script注册的处理程序。
文章源自:明晨网络,明晨网络原创,《让VBS支持WithEvents》,http://www.mingchennet.com/tec/code/vb/32.htm