有谁知道MSXML2.XMLHTTP如何实现其事件(如onreadystatechange)?
由于我需要使用C#构造一个COM组件,该组件将引发事件,但是使用vbscript调用此COM对象的客户端不支持WScript.CreateObject,因此无法处理COM事件。
但是我发现可以在客户端中按如下方式处理MSXML2.XMLHTTP的事件:
Function Hello()
If(objHttp.readyState=4) Then
MsgBox objHttp.responseText
End If
End Function
Set objHttp = CreateObject("MSXML2.XMLHTTP")
Set xmlDoc = CreateObject("MSXML.DOMDocument")
strWebserviceURL="http://localhost:8083/WebService.asmx/HelloWorld"
objHttp.onreadystatechange=getRef("Hello")
objHttp.Open "POST", strWebserviceURL
objHttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
objHttp.send()
我从这里了解到,MSXML2.XMLHTTP事件未实现为COM自动化事件。
因此,我想知道MSXML2.XMLHTTP如何实现其事件,任何人都可以给出提示,任何帮助将不胜感激。
“ onreadystatechange”不是COM自动化事件,因为COM自动化事件要求调用者(主要以脚本语言编写)实现特定的COM接口,而脚本语言通常无法执行这些操作(查找COM连接点以获取完整的详细信息)。
如果您从提供的链接开始,并添加可通过“ OLE View”实用程序(也称为“ OLE-COM对象查看器”)收集的有关MSXML的信息,那么您将拥有找出它所需的一切。
使用Ole View并导航到MSXML类型库(“ \ Type Libraries \ Microsoft XML,v6.0(版本6.0)”)。打开该窗口,这将打开一个单独的窗口,其中详细显示了类型库。
从类型库查看器中,打开“ CoClasses”并查找XMLHTTP60
(这是MSDN帖子中使用的确切类名)。您将验证它是否实现了该IXMLHTTPRequest
接口。
现在,打开Interfaces节点并找到IXMLHTTPRequest
。这将产生以下代码(它是根据存储在类型库中的元数据生成的IDL):
...
[
odl,
uuid(ED8C108D-4349-11D2-91A4-00C04F7969E8),
helpstring("IXMLHTTPRequest Interface"),
dual,
oleautomation
]
interface IXMLHTTPRequest : IDispatch {
...
[id(0x0000000e), propput, helpstring("Register a complete event handler")]
HRESULT onreadystatechange([in] IDispatch* rhs);
};
那告诉你一切如何运作。您将需要在代码中添加一个以IDispatch
引用作为参数的方法。保存参考。您的对象的合同将说,提供的对象必须具有一个名为“ OnWhateverMyEventNameIs”的方法,并可能指定该方法必须采用的参数列表。
当需要通知事件时,您的代码将采用先前提供的引用,查找具有该名称的方法,并在找到后执行该方法。
由于您正在使用C#,因此您的setter方法或属性必须[COMVisible]
(很明显)必须是Object
引用。对于事件触发实现,最简单的事情可能是使用该dynamic
语言的支持来仅调用该方法(在try / catch内,以防该方法不存在或无效)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句