-- 作者:_bbc_
-- 发布时间:6/7/2004 5:06:00 PM
-- VC使用sax出现错误,请用过的帮忙。感谢!!
使用微软的MSXML4.0组件 代码是参照微软的例子,链接http://www.microsoft.com/china/msdn/Archives/workshop/sax2jumpstart.asp 编译时居然出现“未处理的异常:用户断点”,不知是什么来的,而且它的组件里面有很多纯虚函数要重写,这些函数SDK没有说明,不知有什么用,好像是SDK里面的函数调用这些函数似的。如代码中class MyContent : public MSXML2::ISAXContentHandler 的 virtual HRESULT __stdcall raw_startDocument ( ) {return S_OK;} virtual HRESULT __stdcall raw_endDocument ( ) {return S_OK;} 原来的tlh中有这样的定义: virtual HRESULT __stdcall raw_startDocument ( ) = 0; virtual HRESULT __stdcall raw_endDocument ( ) = 0; 如果不重写它们自己创建的对象MyContent又无法实例化。 代码如下,可能长一些: #include <iostream> #include <tchar.h> #import "D:\WINDOWS\System32\msxml4.dll" using namespace std; lass MyContent : public MSXML2::ISAXContentHandler { public: MyContent(); // 定义建立函数和解除函数。 virtual ~MyContent(); // 从 ISAXContentHandler 复制所有的方法。 // 接口... virtual HRESULT STDMETHODCALLTYPE StartDocument(void); virtual HRESULT STDMETHODCALLTYPE EndDocument(void); //virtual HRESULT STDMETHODCALLTYPE StartPrefixMapping(const wchar_t__RPC_FAR *pwchPrefix,int cchPrefix,const wchar_t __RPC_FAR *pwchUri,int cchUri); virtual HRESULT STDMETHODCALLTYPE MyContent::StartElement( /* [in] */ const wchar_t *pwchNamespaceUri, /* [in] */ int cchNamespaceUri, /* [in] */ const wchar_t *pwchLocalName, /* [in] */ int cchLocalName, /* [in] */ const wchar_t *pwchRawName, /* [in] */ int cchRawName, /* [in] */ MSXML2::ISAXAttributes *pAttributes); // ...和底层的 IUnknown 接口... long __stdcall QueryInterface(const struct _GUID &,void ** ); unsigned long __stdcall AddRef(void); unsigned long __stdcall Release(void); // ...和添加任何内容来简化实现。 private: void prt ( char * pszFmt, const wchar_t __RPC_FAR *pwchVal, int cchVal); virtual HRESULT __stdcall raw_putDocumentLocator (/*[in]*/ struct MSXML2::ISAXLocator * pLocator ) {return S_OK;} virtual HRESULT __stdcall raw_startDocument ( ) {return S_OK;} virtual HRESULT __stdcall raw_endDocument ( ) {return S_OK;} virtual HRESULT __stdcall raw_startPrefixMapping ( /*[in]*/ unsigned short * pwchPrefix, /*[in]*/ int cchPrefix, /*[in]*/ unsigned short * pwchUri, /*[in]*/ int cchUri ) {return S_OK;} virtual HRESULT __stdcall raw_endPrefixMapping ( /*[in]*/ unsigned short * pwchPrefix, /*[in]*/ int cchPrefix ) {return S_OK;} virtual HRESULT __stdcall raw_startElement ( /*[in]*/ unsigned short * pwchNamespaceUri, /*[in]*/ int cchNamespaceUri, /*[in]*/ unsigned short * pwchLocalName, /*[in]*/ int cchLocalName, /*[in]*/ unsigned short * pwchQName, /*[in]*/ int cchQName, /*[in]*/ struct MSXML2::ISAXAttributes * pAttributes ) {return S_OK;} virtual HRESULT __stdcall raw_endElement ( /*[in]*/ unsigned short * pwchNamespaceUri, /*[in]*/ int cchNamespaceUri, /*[in]*/ unsigned short * pwchLocalName, /*[in]*/ int cchLocalName, /*[in]*/ unsigned short * pwchQName, /*[in]*/ int cchQName ) {return S_OK;} virtual HRESULT __stdcall raw_characters ( /*[in]*/ unsigned short * pwchChars, /*[in]*/ int cchChars ){return S_OK;} virtual HRESULT __stdcall raw_ignorableWhitespace ( /*[in]*/ unsigned short * pwchChars, /*[in]*/ int cchChars ){return S_OK;} virtual HRESULT __stdcall raw_processingInstruction ( /*[in]*/ unsigned short * pwchTarget, /*[in]*/ int cchTarget, /*[in]*/ unsigned short * pwchData, /*[in]*/ int cchData ) {return S_OK;} virtual HRESULT __stdcall raw_skippedEntity ( /*[in]*/ unsigned short * pwchName, /*[in]*/ int cchName ){return S_OK;} }; MyContent::MyContent() {} MyContent::~MyContent() {} // 现在完成 IUnknown 填充。 // (然而,请牢记,若希望将处理程序作为 COM 对象来实现, // 可以添加比用这些方法显示的 // 更多的功能) long __stdcall MyContent::QueryInterface(const struct _GUID &,void ** ) { return 0; } unsigned long __stdcall MyContent::AddRef() { return 0; } unsigned long __stdcall MyContent::Release() { return 0; } //现在开始着手业务。 // 首先确定您需要的和不需要的事件。 // 对于不需要的方法,处理很简单: HRESULT STDMETHODCALLTYPE MyContent::StartDocument() { return S_OK; // 返回 S_OK 以继续。 // 任何返回的错误代码都将中止语法分析。 } // 对于需要的事件,您可随意处理! HRESULT STDMETHODCALLTYPE MyContent::StartElement( /* [in] */ const wchar_t *pwchNamespaceUri, /* [in] */ int cchNamespaceUri, /* [in] */ const wchar_t *pwchLocalName, /* [in] */ int cchLocalName, /* [in] */ const wchar_t *pwchRawName, /* [in] */ int cchRawName, /* [in] */ MSXML2::ISAXAttributes *pAttributes) { //我想打印标志名称。 prt("\n<%s>",pwchLocalName,cchLocalName); return S_OK; } HRESULT STDMETHODCALLTYPE MyContent::EndDocument(){return S_OK;}; //“prt” 是一个专用方法。 // SAX 不使用它。您不必实现它和任何其他 // 专用方法。 // 这仅是快速打印。 void MyContent::prt ( char * pszFmt, const wchar_t __RPC_FAR *pwchVal, int cchVal ) { static wchar_t fmt[1000], val[1000]; mbstowcs( fmt, pszFmt, 999 ); fmt[999] = 0; wcsncpy( val, pwchVal, (cchVal>999?999:cchVal+1) ); val[999] = 0; wprintf(fmt,val); return; } int _tmain(int argc, _TCHAR* argv[]) { CoInitialize(NULL); try { //测试MSXML组件 MSXML2::ISAXXMLReaderPtr pReader(_uuidof(MSXML2::SAXXMLReader)); MyContent *pContent =new MyContent(); //pReader->putContentHandler(pContent); //pReader->putBaseURL("LogicRe.ytml"); pReader->Release(); } catch(_com_error e) { cerr<<e.Description(); } CoUninitialize(); return 0; } 有谁知道哪里出问题了啊?或者有什么更好的方案可以选择,请指教。谢谢大家啦!!!
|