0

私はC++とC#の知識がありますが、COMは私にとってエイリアンです。startElement()、endElement、processingInstructions()、characters()などのインターフェイスISAXContentHandler(msxml6.DLLの)のすべてのメソッドが実装されているVC ++COMDLLがあります。つまり、これらのインターフェイスメソッドは、VC ++COMDLLで実装されています。このVC++COM DLLをC#DLLに変換して、この変換されたC#DLLをC#アプリケーションから呼び出すことができるようにします。

私は、これらのインターフェース方法がどこから呼び出されているのか理解していません。VC ++COMDLL内から「関数呼び出しステートメント」が作成されていないためです。

例:----- VC ++COMDLLに実装されているインターフェイスメソッドの1つは次のように始まります--->

  **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パーサーであることを知っています。この関数のこれらのパラメーターが何であるかわかりません。また、dパラメーター名とともに_RPCキーワードを使用しています。そして、私は理解していません、FROMどこでこれらの関数が呼び出されているのですか。

4

1 に答える 1

1

SAXパーサーは非同期(イベントベース)パーサーです。通常、パーサーを起動して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 に答える