Я реализовал 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.
Задача ещё не решена.
Других решений пока нет …