2013-11-04 45 views
3

我想在Visual C++中针对XSD模式验证XML文件。我环顾了互联网,我发现的MSXML例子似乎是最直接的。可能的标题冲突

我正在尝试将this集成到我正在处理的项目中。我创建了XMLSchemaValidation类来对某些XSD模式执行验证,并使用相应的XSD文件名初始化对象。我在头文件中的下列指令:

#import "C:\Windows\System32\msxml6.dll" 

,但我开始收到以下错误的looot:

7>d:\proiecte\wtlcommon\basegui\gdiplushelpers.h(28): error C2872: 'Font' : ambiguous symbol 
7>   could be 'c:\program files (x86)\microsoft visual studio 10.0\vc\include\comdef.h(312) : Font' 
7>   or  'c:\program files (x86)\microsoft sdks\windows\v7.0a\include\gdiplusheaders.h(244) : Gdiplus::Font' 

,我也得到:

7>...\wizarddlgskin.h(96): error C2259: 'Font' : cannot instantiate abstract class 
7>   due to following members: 
7>   'HRESULT IUnknown::QueryInterface(const IID &,void **)' : is abstract 
7>   c:\program files (x86)\microsoft sdks\windows\v7.0a\include\unknwn.h(116) : see declaration of 'IUnknown::QueryInterface' 
7>   'ULONG IUnknown::AddRef(void)' : is abstract 
7>   c:\program files (x86)\microsoft sdks\windows\v7.0a\include\unknwn.h(120) : see declaration of 'IUnknown::AddRef' 
7>   'ULONG IUnknown::Release(void)' : is abstract 
7>   c:\program files (x86)\microsoft sdks\windows\v7.0a\include\unknwn.h(122) : see declaration of 'IUnknown::Release' 
7>   'HRESULT IDispatch::GetTypeInfoCount(UINT *)' : is abstract 
7>   c:\program files (x86)\microsoft sdks\windows\v7.0a\include\oaidl.h(2123) : see declaration of 'IDispatch::GetTypeInfoCount' 
7>   'HRESULT IDispatch::GetTypeInfo(UINT,LCID,ITypeInfo **)' : is abstract 
7>   c:\program files (x86)\microsoft sdks\windows\v7.0a\include\oaidl.h(2126) : see declaration of 'IDispatch::GetTypeInfo' 
7>   'HRESULT IDispatch::GetIDsOfNames(const IID &,LPOLESTR *,UINT,LCID,DISPID *)' : is abstract 
7>   c:\program files (x86)\microsoft sdks\windows\v7.0a\include\oaidl.h(2131) : see declaration of 'IDispatch::GetIDsOfNames' 
7>   'HRESULT IDispatch::Invoke(DISPID,const IID &,LCID,WORD,DISPPARAMS *,VARIANT *,EXCEPINFO *,UINT *)' : is abstract 
7>   c:\program files (x86)\microsoft sdks\windows\v7.0a\include\oaidl.h(2138) : see declaration of 'IDispatch::Invoke' 

我最初有#import <msxml.dll>与示例代码一样,但MSXML安装不会将这些文件放在W7上的位置。

我已经在stdafx.h中文件中删除#define WIN32_LEAN_AND_MEANErrors using msxml6.h on visual c++

我在做什么错?

+2

如果你可以发布你的代码,人们可以更好地帮助你。 – doptimusprime

回答

1

这不是真正的标题冲突,而是名称冲突。如果在同一翻译单元中包含声明相同名称的不同库的标题,并且这些库中的一个或多个不在相应的名称空间内声明冲突名称,或者如果您(或上帝禁止),则其中一个库头文件)使用using指令将名称倒出到命名空间范围中。

那么,什么可以做,以摆脱错误的:

首先,扫描您的代码使用的指令,尤其是对using namespace Gdiplus;using Gdiplus::Font;因为这似乎是冲突的名称。然后通常尽量避免在同一个翻译单元中包含GDIPlus和comdef头文件。这最好通过限制两种包含到.cpp文件来完成。如果您绝对必须将其中的一个包含在标题中,则该标题本身应限制为给定的子模块,而其他标题不应用于整个子模块。
可能有一点您要使用这两个库的功能。如果是这种情况,您仍然可以通过为每个libray的功能提供一个接口来分离使用这些库本身。这样,您可以封装库的使用,并可以控制接口中的名称,以避免在使用这两种功能的地方发生冲突。

这是一些非常普遍的文本 - 如果您向我们显示出现问题的代码,可以给出示例。

+0

问题解决了,但我不明白为什么。问题是我已经将'msxml6.dll'导入到头文件中,而不是.cpp文件。我不明白为什么这会导致错误。 – GreatDane

+1

通过将其导入到包含标题的任何翻译单元中,直接或间接地将其导入到标题中 - 显然包括其他名称也已知的TU,从而导致名称冲突。 –