0

我有 C++ 和 C# 方面的知识,但 COM 对我来说是外星人。我有一个 VC++ COM DLL,其中实现了接口 ISAXContentHandler(属于 msxml6.DLL)的所有方法,如 startElement()、endElement、processingInstructions()、characters() 等。即这些接口方法在VC++ COM DLL 中实现。我想将此 VC++ COM DLL 转换为 C# DLL,以便我可以从我的 C# 应用程序调用此转换后的 C# DLL。

我不明白从哪里调用这些接口方法。因为在我的 VC++ COM DLL 中没有“函数调用语句”。

例如:-----VC++ COM DLL中实现的接口方法之一是这样开始的--->

  **HRESULT STDMETHODCALLTYPE ContentHandler_SAX::startElement( 
        /* [in] */ wchar_t __RPC_FAR *pwchNamespaceUri,
        /* [in] */ int cchNamespaceUri,
        /* [in] */ wchar_t __RPC_FAR *pwchLocalName,
        /* [in] */ int cchLocalName,
        /* [in] */ wchar_t __RPC_FAR *pwchRawName,
        /* [in] */ int cchRawName,
        /* [in] */ ISAXAttributes __RPC_FAR *pAttributes)**

该类正在从 msxml6.dll 实现 ISAXContentHAndler 接口。

我只知道 SAXContentHandler 是一个 XML 解析器。我不知道这个函数的这些参数是什么,而且它们使用 _RPC 关键字和 d 参数名称。而且我不明白,从哪里调用这些函数。

4

1 回答 1

1

SAX Parser 是异步(基于事件的)解析器 - 通常,您启动解析器并为其提供 xml 文件/流,它会在遇到各种 xml 节点时引发事件。作为 COM 库,它使用 COM 事件模型,通常组件(在这种情况下为解析器)会定义一个回调接口(还有其他接口允许注册事件等)。

所以 ISAXContentHAndler 是一个回调接口,它应该由使用解析器的代码实现。您会发现在代码的某处,创建了 SAXXMLReader 组件,然后将ISAXXMLReadercontentHandler上的属性设置为实现 ISAXContentHAndler 的类的实例。

您会在代码中找到对此接口的调用,因为它是 SAX 解析器,它将调用此接口上的方法 - 例如,每当遇到任何元素的开始标记时,它都会调用此接口上的 startElement 方法。

请参阅以下链接以更好地了解 SAX:http: //msdn.microsoft.com/en-us/library/ms753774 (v=VS.85).aspx http://msdn.microsoft.com/en-us/library/ ms763771(v=VS.85).aspx

于 2010-11-11T07:28:32.470 回答