[ 
http://issues.apache.org/jira/browse/XERCESC-1518?page=comments#action_12332427 
] 

Puyoman commented on XERCESC-1518:
----------------------------------

My source code follows:
*****************************************************
#include "stdafx.h"
#include <Include/PlatformDefinitions.hpp>

#include <xercesc/parsers/XercesDOMParser.hpp>
#include <xercesc/dom/DOM.hpp>
#include <xercesc/sax/HandlerBase.hpp>
#include <xercesc/sax/SAXParseException.hpp>
#include <xercesc/util/XMLString.hpp>
#include <xercesc/util/PlatformUtils.hpp>
#include <xercesc/util/OutOfMemoryException.hpp>

#include <stdio.h>
#include <string.h>

XERCES_CPP_NAMESPACE_USE

class DOMTreeErrorReporter : public ErrorHandler
{
public:
    // -----------------------------------------------------------------------
    //  Constructors and Destructor
    // -----------------------------------------------------------------------
    DOMTreeErrorReporter() :
       fSawErrors(false)
    {
                err = "";
    }

    ~DOMTreeErrorReporter()
    {
    }


    // -----------------------------------------------------------------------
    //  Implementation of the error handler interface
    // -----------------------------------------------------------------------
    void warning(const SAXParseException& toCatch);
    void error(const SAXParseException& toCatch);
    void fatalError(const SAXParseException& toCatch);
    void resetErrors();

    // -----------------------------------------------------------------------
    //  Getter methods
    // -----------------------------------------------------------------------
    bool getSawErrors() const;

    bool    fSawErrors;
        CString err;
};

inline bool DOMTreeErrorReporter::getSawErrors() const
{
    return fSawErrors;
}


void DOMTreeErrorReporter::warning(const SAXParseException&)
{
    //
    // Ignore all warnings.
    //
}

void DOMTreeErrorReporter::error(const SAXParseException& toCatch)
{
    fSawErrors = true;
        char* mes1 = XMLString::transcode(toCatch.getSystemId());
        char* mes2 = XMLString::transcode(toCatch.getMessage());
        char buf[20];
        _ltoa(toCatch.getColumnNumber(),buf,10);
        char* mes3 = (char*)XMLString::transcode(buf);
        _ltoa(toCatch.getLineNumber(),buf,10);
        char* mes4 = (char*)XMLString::transcode(buf);
        err += "Error at file \"";
        err += mes1;
        err += "\", line ";
        err += mes4;
        err += ", column ";
        err += mes3;
        err += "\n   Message: ";
        err += mes2;
        if(mes1)delete mes1;
        if(mes2)delete mes2;
        if(mes3)delete mes3;
        if(mes4)delete mes4;
}

void DOMTreeErrorReporter::fatalError(const SAXParseException& toCatch)
{
    fSawErrors = true;
        char* mes1 = XMLString::transcode(toCatch.getSystemId());
        char* mes2 = XMLString::transcode(toCatch.getMessage());
        char buf[20];
        _ltoa(toCatch.getColumnNumber(),buf,10);
        char* mes3 = (char*)XMLString::transcode(buf);
        _ltoa(toCatch.getLineNumber(),buf,10);
        char* mes4 = (char*)XMLString::transcode(buf);
        err += "Fatal Error at file \"";
        err += mes1;
        err += "\", line ";
        err += mes4;
        err += ", column ";
        err += mes3;
        err += "\n   Message: ";
        err += mes2;
        if(mes1)delete mes1;
        if(mes2)delete mes2;
        if(mes3)delete mes3;
        if(mes4)delete mes4;
}

void DOMTreeErrorReporter::resetErrors()
{
    fSawErrors = false;
}


int parse (const char* xmlFile, CString& errmsg)
{
char* message = NULL;

        try
        {
                XMLPlatformUtils::Initialize();
        }
        catch (const XMLException& toCatch)
        {
                char*message = XMLString::transcode(toCatch.getMessage());
                errmsg = message;
                XMLString::release(&message);
                return -1;
        }

        XercesDOMParser* parser = new XercesDOMParser();
        //parser->setValidationScheme(XercesDOMParser::Val_Always);    // 
optional.
        parser->setDoNamespaces(true);    // optional
        //parser->setValidationSchemaFullChecking(true);
        //parser->setValidationConstraintFatal(true);
        parser->setDoValidation(true);
        //parser->setDoSchema(true);
        //parser->setExitOnFirstFatalError(true);
    //parser->setCreateEntityReferenceNodes(true);
        //parser->setExternalSchemaLocation("//test/xalan/Release/mem-pte2.dtd"
                                                        
/*"C:/test/xalan/Release/mathml2.dtd "
                                                        
"C:/test/xalan/Release/soextblx.dtd "
                                                        
"C:/test/xalan/Release/wipo.ent");*/
        
//parser->setExternalNoNamespaceSchemaLocation("//test/xalan/Release/mem-pte2.dtd");
        //ErrorHandler* errHandler = (ErrorHandler*) new HandlerBase();

        //DOMTreeErrorReporter *errReporter = new DOMTreeErrorReporter();
        //parser->setErrorHandler(errReporter);

        //
        //  Parse the XML file, catching any XML exceptions that might propogate
        //  out of it.
        //
        bool errorsOccured = false;
        try
        {
                parser->parse(xmlFile);
        }
        catch (const OutOfMemoryException&)
        {
                //XERCES_STD_QUALIFIER cerr << "OutOfMemoryException" << 
XERCES_STD_QUALIFIER endl;
                errmsg = "OutOfMemoryException\n";
                errorsOccured = true;
        }
        catch (const XMLException& e)
        {
                //XERCES_STD_QUALIFIER cerr << "An error occurred during 
parsing\n   Message: "
                message = XMLString::transcode(e.getMessage());
                errmsg = message;
                XMLString::release(&message);
                errorsOccured = true;
        }
        catch (const DOMException& e)
        {
                const unsigned int maxChars = 2047;
                XMLCh errText[maxChars + 1];

                if (DOMImplementation::loadDOMExceptionMsg(e.code, errText, 
maxChars))
                {
                        message = XMLString::transcode(errText);
                        errmsg = message;
                        XMLString::release(&message);
                }
                errorsOccured = true;
        }
        catch (...)
        {
                //XERCES_STD_QUALIFIER cerr << "An error occurred during 
parsing\n " << XERCES_STD_QUALIFIER endl;
                errmsg = "An error occurred during parsing\n";
                errorsOccured = true;
        }
        XMLString::release(&message);
        delete parser;
        XMLPlatformUtils::Terminate();
        return(errorsOccured ? -1 : 0);
}

*****************************************************
I only call this function for parsing.
Whenever parsing one xml file, this function is called.
i)Adding include directories for compiling:
  xerces-c-src_2_7_0\src
  "ICU 3.4\include"
  xml-xalan\c\src
ii)Adding linked libraries:
  xerces-c-src_2_7_0\Build\Win32\VC7\release\xerces-c_2.lib
  xerces-c-src_2_7_0\Build\Win32\VC7\release\xerces-depdom_2.lib
  xml-xalan\c\Build\Win32\VC6\release\Xalan-C_1.lib
  xml-xalan\c\Build\Win32\VC6\release\Harness_1.lib
  "ICU 3.4\lib\icuuc.lib"



> Always General Exception Error when being called from MFC application
> ---------------------------------------------------------------------
>
>          Key: XERCESC-1518
>          URL: http://issues.apache.org/jira/browse/XERCESC-1518
>      Project: Xerces-C++
>         Type: Bug
>   Components: Validating Parser (DTD)
>     Versions: 2.7.0
>  Environment: OS:windows XP Pro sp2
> compiler: VC++ 7.0 2002
> memory:512MB
> Xerces version:2.7.0
> Xalan version: 1.9
> ICU version:3.4
>     Reporter: Puyoman
>     Priority: Critical

>
> I built Xerces+ICU and the parsing MFC application.
> When my application window closed and end to ExitInstance(), general 
> protection
> error happened (read address:0xC0000005 place:0x00000000).
> In other case, if application don't call parse functions, these errors don't 
> happen.
> Its parse is validating parse and DOM creating.
> So much exception is generated:
> Microsoft C++ exception: xercesc_2_7::EndOfEntityException @ 0x0012263c
> Microsoft C++ exception: xercesc_2_7::EndOfEntityException @ 0x00123460
> Microsoft C++ exception: xercesc_2_7::EndOfEntityException @ 0x0011ead4
> Microsoft C++ exception: xercesc_2_7::EndOfEntityException @ 0x0011eb98
> Microsoft C++ exception: xercesc_2_7::EndOfEntityException @ 0x0011f8f8
> Microsoft C++ exception: xercesc_2_7::EndOfEntityException @ 0x0011f9bc
> Microsoft C++ exception: xercesc_2_7::EndOfEntityException @ 0x0011e8e4
> Does xerces (especially, debugging version) consume a large amount of 
> heap areas?
> Xerces destroys even the area of MFC and the application program. 

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to