【问题标题】:Event in MSXML2.XMLHTTPMSXML2.XMLHTTP 中的事件
【发布时间】:2015-08-07 23:02:29
【问题描述】:

有谁知道 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如何实现它的事件,任何人都可以给出提示,任何帮助将不胜感激。

【问题讨论】:

    标签: c# vbscript com


    【解决方案1】:

    "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 接口。

    现在,打开接口节点并找到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 中,以防方法不存在或无效)。

    【讨论】:

    • 非常感谢。这对我帮助很大。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    • 2010-11-20
    • 2021-12-20
    相关资源
    最近更新 更多