以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 DOM/SAX/XPath 』  (http://bbs.xml.org.cn/list.asp?boardid=11)
----  VC使用sax出现错误,请用过的帮忙。感谢!!  (http://bbs.xml.org.cn/dispbbs.asp?boardid=11&rootid=&id=8170)


--  作者:_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;
}

有谁知道哪里出问题了啊?或者有什么更好的方案可以选择,请指教。谢谢大家啦!!!


 


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
3,687.500ms