我在c ++中实现了一个com对象,该对象使用SAXXMLReader60
接口来验证针对xsd架构的一些xml文件。
我还实施了SAXContentHandlerImpl
,SAXErrorHandlerImpl
,MySAXSchemaDeclHandler
(源自IMXSchemaDeclHandler
),如此处所述(xml primer, the book),以便能够获取有关的信息错误,架构和内容。
所以如果com从c ++客户端调用,一切正常,但是如果com已经从c#client调用(使用“interop”)它仍然正常,除了我每次都得到一个空{{1方法中的指针:
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
这就是我从c#client(4.0 .NET)调用com的方法:
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");
有没有建议如何解决问题?
顺便说一下,我使用的是Visual Studio 2010,msxml6.0,Windows 7。