Запрос относительно вызова метода для интерфейса ISAXContentHandler из msxml6.DLL - PullRequest
0 голосов
/ 11 ноября 2010

У меня есть знания по C ++ и C #, но COM для меня - Чужой. У меня есть VC ++ COM DLL, в которой реализованы все методы интерфейса ISAXContentHandler (из msxml6.DLL), такие как startElement (), endElement, processingInstructions (), characters () и т. Д. Т.е. этим интерфейсным методам дано внедрение в VC ++ COM DLL. Я хочу преобразовать эту VC ++ COM DLL в C # DLL, чтобы я мог вызвать эту преобразованную C # DLL из моего приложения C #.

Я не понимаю, откуда эти методы взаимодействия вызываются. Потому что внутри моей DLL-библиотеки VC ++ COM не производится «оператор вызова функции».

Например: ----- один из методов интерфейса, реализованных в COM DLL VC ++, запускается следующим образом: ->

  **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)**

В clas реализован интерфейс ISAXContentHAndler из msxml6.dll.

Я просто знаю, что SAXContentHandler - это анализатор XML. Я не знаю, каковы эти параметры для этой функции, а также они используют ключевое слово _RPC вместе с именем параметра d. И я не понимаю, откуда эти функции вызываются.

1 Ответ

1 голос
/ 11 ноября 2010

SAX Parser - это асинхронный (основанный на событиях) синтаксический анализатор - обычно вы запускаете синтаксический анализатор, предоставляя ему файл / поток xml, и он вызывает события при обнаружении различных узлов xml. Будучи библиотекой COM, она использует модель событий COM, в которой компонент (в данном случае синтаксический анализатор) определяет интерфейс обратного вызова ( существуют другие интерфейсы, которые позволяют регистрироваться для событий и т. Д. ).

Итак, ISAXContentHAndler - это интерфейс обратного вызова, который должен быть реализован с помощью кода с использованием синтаксического анализатора. Вы обнаружите, что где-то в коде создается компонент SAXXMLReader, а затем свойство contentHandler в ISAXXMLReader устанавливается в качестве экземпляра класса, реализующего 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

...