MSXML2.XMLHTTP中的事件

时间:2015-05-26 10:18:06

标签: c# vbscript com

有没有人知道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()

我从here了解到,MSXML2.XMLHTTP事件未实现为COM自动化事件。
所以我想知道MSXML2.XMLHTTP如何实现它的事件,任何人都可以提示,任何帮助都将受到赞赏。

1 个答案:

答案 0 :(得分:0)

"的onreadystatechange"不是COM自动化事件,因为COM自动化事件需要调用者(主要用脚本语言编写)来实现特定的COM接口,脚本语言通常无法做到(查找COM连接点以获取完整的详细信息)。

如果您从您提供的链接开始,并添加有关MSXML的信息,您可以使用" OLE视图"实用程序(也称为" OLE-COM对象查看器"),您拥有了解所需的一切。

使用Ole View并导航到MSXML类型库(" \ Type Libraries \ Microsoft XML,v6.0(ver 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中,以防方法不存在或者无效)。