C# MSXML2.XMLHTTP中的事件

C# MSXML2.XMLHTTP中的事件,c#,vbscript,com,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

有人知道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连接点以获取完整详细信息)

如果您从提供的链接开始,并添加有关MSXML的信息,这些信息可以通过“OLE View”实用程序(也称为“OLE-COM对象查看器”)收集,那么您就拥有了解决这些问题所需的一切

使用Ole视图并导航到MSXML类型库(“\type Libraries\Microsoft XML,v6.0(6.0版)”)。打开该视图,将打开一个单独的窗口,其中详细显示了类型库

从类型库查看器中,打开“CoClasses”并找到
XMLHTTP60
(这是MSDN post中使用的确切类名)。您将验证它是否实现了
IXMLHTTPRequest
接口

现在,打开Interfaces节点并找到
IXMLHTTPRequest
。这将生成以下代码(根据类型库中存储的元数据生成IDL):

这将告诉您它是如何工作的。您需要向代码中添加一个方法,该方法将
IDispatch
引用作为参数。保存引用。对象的契约将说明提供的对象必须具有一个名为“OnWhateverMyEventNameIs”的方法,并可能指定该方法必须采用的参数列表

当您的事件需要发出信号时,您的代码将采用之前提供的引用,查找具有该名称的方法,如果找到,则执行该方法


由于您使用的是C#,因此setter方法或属性需要是
[COMVisible]
(显然),并且它应该使用
对象
引用。事件触发实现的最简单方法可能是使用该语言中的
动态
支持来调用该方法(在try/catch中,以防该方法不存在或无效)。

非常感谢。这对我帮助很大。
...
[
  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);
};