Hi Alberto,
at first thanks for your fast answer. I am using stack objects, but I starts
the parsing in an child stackframe, so that the stackobjects should be valid
at parse-time. The program runs in debug build well, but in the release
build it crashes. I found out that it crashes at XMLString::replicate()
(called by RegxParser::parse()) at the memcpy()-function. The program don't
crashes if I remove my own entity resolver.

Here is some code of my program for you:

Here is my entity resolver:

class MyEntityResolver : public XMLEntityResolver
{
public:
virtual ~MyEntityResolver()
{

}


MyEntityResolver()
{

}

virtual InputSource *resolveEntity(XMLResourceIdentifier
*resourceIdentifier)
{
//this prozedure get fired one time, but all the pointers are invalid (I
made them public for reading them)
printf("BaseURI: 0x%08X\nLocator: 0x%08X\nNameSpace: 0x%08X\nPublicId:
0x%08X\nResourceIdentifierType: 0x%08X\n"
"SystemId: 0x%08X"
, (UINT) resourceIdentifier->fBaseURI, (UINT) resourceIdentifier->fLocator,
(UINT) resourceIdentifier->fNameSpace, (UINT) resourceIdentifier->fPublicId,
(UINT) resourceIdentifier->fResourceIdentifierType, (UINT)
resourceIdentifier->fSystemId);

return g_pMemBufSourceForDTD;
}
};


And here is the code for parsing the XML-file:

SAX2XMLReader* pParser = XMLReaderFactory::createXMLReader();

XMLPScanToken Token;
MyDocumentHandler XmlHandler;

MemoryManagerImpl MemManager;
void * pDestXMLData;
Grammar * pGrammar;

pDestXMLData = MemManager.allocate(p_nSize);
memcpy(pDestXMLData, p_pXMLData, p_nSize);

MemBufInputSource MemBufSource(
(const XMLByte *) pDestXMLData,
p_nSize,
"Fake sytem ID",
FALSE,
&MemManager);

pParser->setContentHandler(&XmlHandler);

MyErrorHandler XmlErrorHandler;
pParser->setErrorHandler(&XmlErrorHandler);


MyEntityResolver XmlEntityResolver;
pParser->setEntityResolver((EntityResolver *const) &XmlEntityResolver);

pGrammar = pParser->loadGrammar(
*g_pMemBufSourceForDTD,
Grammar::DTDGrammarType,
TRUE);

pParser->setFeature(XMLUni::fgXercesUseCachedGrammarInParse, TRUE);
pParser->setFeature(XMLUni::fgXercesSchemaFullChecking, TRUE);
pParser->setFeature(XMLUni::fgSAX2CoreValidation, TRUE);
pParser->setFeature(XMLUni::fgXercesSkipDTDValidation, FALSE);
pParser->setFeature(XMLUni::fgXercesLoadExternalDTD, TRUE);
pParser->setFeature(XMLUni::fgXercesDynamic, TRUE);

try
{
if(!pParser->parseFirst(MemBufSource, Token))    //Here is the crash!
{
goto ParseError;
}

while(pParser->parseNext(Token))
{
if(g_bParseError == TRUE)
{
MemManager.deallocate(pDestXMLData);
delete pParser;
return FALSE;
}
}
}

Is that all you need?

Greetings
Robert

2011/4/14 Alberto Massari <alberto.mass...@progress.com>

Hi Robert,
it's hard to tell what's wrong without seeing your code. I would guess you
are allocating an object on the stack that is destroyed before the parsing
take place...
Could you share the code you are using?

Alberto

Il 14/04/2011 17:56, Robert Wermuth ha scritto:

Hello,
I am using xerces 3.1.1 with the SAX2XMLReader. I use
pParser->setEntityResolver() to install my own entity resolver. I compile my
project with Visual Studio c++ 9.1 (using the static xerces libs). But in
the Release build my program crashes on pParser->parseFirst() when I set my
entity resolver.I tried to compile the example code shown there:
http://xerces.apache.org/xerces-c/apiDocs-3/classXMLEntityResolver.html. But
I get a compiler error (XMLResourceIdentifier::SystemId is not defined.). Is
there an error in the lib?

Greetings
Robert

>
>
>>
>>

Reply via email to