c # клиент для c ++ msxml синтаксический анализатор саксофона com объект странное поведение

Я реализовал com объект в C ++, который использует SAXXMLReader60 интерфейс для проверки некоторых XML-файлов по схеме xsd.

Я также реализовал SAXContentHandlerImpl, SAXErrorHandlerImpl, MySAXSchemaDeclHandler (происходит от IMXSchemaDeclHandler) как это описано здесь (XML учебник, книга) иметь возможность получать информацию об ошибках, схеме и содержании.

Таким образом, все работает просто отлично, если com вызвал из клиента c ++, но если com вызвал из клиента c # (используя «interop»), он все еще работает нормально, за исключением того, что я получаю каждый раз пустой oSchemaElement указатель в методе:

virtual HRESULT STDMETHODCALLTYPE MySAXSchemaDeclHandler::schemaElementDecl( /* [in] */ ISchemaElement *oSchemaElement )
{
// oSchemaElement is not null here, it points to somewhere
// but contains nothing
}

Эта часть кода, где SAXContentHandlerImpl, SAXErrorHandlerImpl, IMXSchemaDeclHandler а также ISAXXMLReaedr связаны Я сомневаюсь с этой частью кода:

ISAXXMLreader* pReader = NULL;
HRESULT hr = CoCreateInstance(__uuidof(SAXXMLReader60),NULL,CLSCTX_ALL,    __uuidof(ISAXXMLReader),(void **)&pReader);

IXMLDOMSchemaCollectionPtr pSchemaCache = NULL;
hr = pSchemaCache.CreateInstance(__uuidof(XMLSchemaCache60));
_variant_t vSchemaCache(new IXMLDOMSchemaCollectionPtr);

V_VT(&vSchemaCache) = VT_DISPATCH;
V_DISPATCH(&vSchemaCache) = pSchemaCache;

MySAXSchemaDeclHandler *pMySAXSchemaDeclHandler = new MySAXSchemaDeclHandler();
_variant_t vSchemaDecl(new MySAXSchemaDeclHandler());

V_VT(&vSchemaDecl) = VT_DISPATCH;
V_DISPATCH(&vSchemaDecl) = pMySAXSchemaDeclHandler;

hr = pReader->putFeature(L"schema-validation", TRUE);
hr = pReader->putProperty(L"schemas", vSchemaCache);
hr = pReader->putProperty(L"schema-declaration-handler", vSchemaDecl);

pReader->parseURL("books.xml");

Вот как я назвал com из клиента c # (4.0 .NET):

[STAThread]
static void Main(string[] args)
{
try
{
SAXCOMLib.SAXCOMClass Parser = new SAXCOMLib.SAXCOMClass();
Parser.SetXMLAbsFileName("books.xsd");
Parser.SetXSDAbsFileName("books.xml");

Parser.Parse();
}
catch (System.Runtime.InteropServices.COMException exn)
{
Console.WriteLine(exn.Message);
}
Console.ReadLine();
}

Есть какие-нибудь предложения, как решить проблему?

Кстати я использовал Visual Studio 2010, msxml6.0, Windows 7.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]