明晨网络

电话: 136-6532-7492 QQ: 给我发送消息 8507-0741

让VBS支持WithEvents

明晨网络原创,2009-06-12 19:59, 文章标签: VB VBS

    显然,VBS脚本不支持WithEvents,就算activex dll中设置了raiseevent ,vbs调用时也无法触发。
    如果在html和hta用vbs脚本调用activex com,可以实现WithEvents。比如用VB写了一个dll,raiseevent一个事件Report,在hta中这样实现WithEvents
 

代码如下
  1. <html>
  2. <head>
  3. <title>HTA蜘蛛</title>
  4. </head>
  5. <object classid="clsid:942A9C51-90E8-4A52-BDB9-4EC7A87C6D46" id="Spider" width="320" height="320">
  6. </object>
  7. <body>
  8. <script type="text/vbscript">
  9.  
  10. Sub Spider_Report(ByVal isErr  , ByVal Des )
  11.     Msgbox Des,,isErr
  12. End Sub
  13.  
  14. Spider.Start
  15.  
  16. </script>
  17. </body>
  18. </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