Hi Alberto, thanks a lot, now it works. But I have an another point. When I compile my wrong code as release build, but with optimation deactivated (compiler option /Od), the program don't crashes. But the pointers in the "XMLResourceIdentifier *resourceIdentifier"-parameter of my MyEntityResolver are also invalid. I don't know how important this information is for you.
Greetings Robert 2011/4/15 Alberto Massari <alberto.mass...@progress.com> > Hi Robert, > you are creating an XMLEntityResolver, but using the setEntityResolver API > that expects an EntityResolver interface; infact, you had to add a cast to > force the compiler in doing this illegal thing. > You should instead use the setXMLEntityResolver API, that accepts the > correct base interface. However, it's not available in the SAX2XMLReader > interface, and you will have to cast it down to the implementation class > > ((SAX2XMLReaderImpl*)pParser)->setXMLEntityResolver(&XmlEntityResolver); > > Alberto > > Il 15/04/2011 10:33, Robert Wermuth ha scritto: > >> 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 >> >> >>> >>>> . >> >> >