Возможное столкновение заголовка

Я хочу проверить XML-файлы на соответствие схемам XSD в Visual C ++. Я посмотрел в Интернете, и примеры MSXML, которые я нашел, казались наиболее простыми.

Я пытаюсь интегрировать этот в проект, над которым я работаю. я создал XMLSchemaValidation класс для выполнения проверки для определенных схем XSD, и я инициализирую объекты с соответствующим именем файла XSD. У меня есть следующие директивы в заголовочном файле:

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

но я начал получать сообщение о следующей ошибке:

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.

Я уже удалила #define WIN32_LEAN_AND_MEAN в файле stdafx.h ( Ошибки при использовании msxml6.h на Visual C ++ )

Что я делаю неправильно?

3

Решение

На самом деле это не коллизия заголовков, а коллизия имен. Они появляются, если вы включаете заголовки разных библиотек, объявляющих одно и то же имя в одном и том же модуле перевода, и если одна или несколько из этих библиотек не объявляют конфликтующее имя в правильном пространстве имен или если вы (или не дай бог, одна из библиотек) заголовки) вылить имена в область имен с помощью директивы using.

Итак, что вы можете сделать, чтобы избавиться от ошибки:

Во-первых, отсканируйте свой код для использования директив, особенно для using namespace Gdiplus; а также using Gdiplus::Font; так как это, кажется, встречное имя. Затем обычно старайтесь избегать включения заголовков GDIPlus и comdef в один и тот же модуль перевода. Это лучше всего сделать, ограничив оба вида включаемых файлов .cpp. Если вам абсолютно необходимо включить один из них в заголовок, этот заголовок должен быть ограничен данным подмодулем, а другие заголовки не должны использоваться во всем подмодуле.
Там может быть момент, когда вы хотите использовать функциональность обеих библиотек. Если это так, вы все равно можете отделить использование самих библиотек, предоставив интерфейс для функций, которые вы хотите использовать для каждого из библиотек. Таким образом, вы инкапсулируете использование библиотеки и можете управлять именами в интерфейсах, чтобы избежать коллизий в точке, где вы используете обе функции.

Это очень общий текст — примеры можно привести, если вы покажете нам код, который создает проблемы.

1

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

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

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