MSXML2.XMLHTTP 中的事件
Event in MSXML2.XMLHTTP
有谁知道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 如何实现它的事件,任何人都可以给出提示,任何帮助将不胜感激。
"onreadystatechange" 不是 COM 自动化事件,因为 COM 自动化事件要求调用者(主要用脚本语言编写)实现特定的 COM 接口,而脚本语言通常做不到(查找 COM 连接点以获得完整的细节)。
如果您从您提供的 link 开始,并添加您可以使用 "OLE View" 实用程序(也称为 "OLE-COM Object Viewer")收集的有关 MSXML 的信息,你已经拥有了解决问题所需的一切。
使用 Ole View 并导航到 MSXML 类型库 ("\Type Libraries\Microsoft XML, v6.0 (ver 6.0)")。打开它,这将打开一个单独的 window,其中详细显示了类型库。
从类型库查看器中,打开 "CoClasses" 并找到 XMLHTTP60
(这是 MSDN post 中使用的确切 class 名称)。您将验证它是否实现了 IXMLHTTPRequest
接口。
现在,打开接口节点并找到 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 内,以防该方法不存在或无效)。
有谁知道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 如何实现它的事件,任何人都可以给出提示,任何帮助将不胜感激。
"onreadystatechange" 不是 COM 自动化事件,因为 COM 自动化事件要求调用者(主要用脚本语言编写)实现特定的 COM 接口,而脚本语言通常做不到(查找 COM 连接点以获得完整的细节)。
如果您从您提供的 link 开始,并添加您可以使用 "OLE View" 实用程序(也称为 "OLE-COM Object Viewer")收集的有关 MSXML 的信息,你已经拥有了解决问题所需的一切。
使用 Ole View 并导航到 MSXML 类型库 ("\Type Libraries\Microsoft XML, v6.0 (ver 6.0)")。打开它,这将打开一个单独的 window,其中详细显示了类型库。
从类型库查看器中,打开 "CoClasses" 并找到 XMLHTTP60
(这是 MSDN post 中使用的确切 class 名称)。您将验证它是否实现了 IXMLHTTPRequest
接口。
现在,打开接口节点并找到 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 内,以防该方法不存在或无效)。