MSXML2 не имеет проблемы с членом IXMLDOMNode в VC++ 2010

Я пытаюсь скомпилировать унаследованный мной проект VC++, использующий MSXML2. Это проект ATL .EXE. Заголовочный файл включает в себя следующее:

#include "msxml2.h"

using namespace MSXML2;

Определения препроцессора включают __USE_MSXML2_NAMESPACE__, который я добавил в проект, поскольку без него пространство имен MSXML2 было неопределенным. При попытке построить этот проект я получаю много ошибок вида:

ошибка C2039: "IXMLDOMNode": не является членом "MSXML2"

Эти ошибки создаются объявлениями, подобными следующим

CComPtr<MSXML2::IXMLDOMNode> pNode;

Другие элементы не найдены, включая IXMLDOMDocument и IXMLDOMNode.


person Nack    schedule 25.01.2011    source источник
comment
Можно ли включить msxml2.h, удалить USE_MSXML2_NAMESPACE и использовать пространство имен MSXML2, а также использовать CComPtr‹IXMLDOMNode› pNode;? Это должно сработать.   -  person Samuel Zhang    schedule 25.01.2011
comment
Спасибо! Это действительно сработало, можете ли вы дать мне краткое объяснение, что пошло не так?   -  person Nack    schedule 26.01.2011


Ответы (1)


Вы можете исправить это

  1. Включите заголовок msxml2.h.
  2. Удалите код USE_MSXML2_NAMESPACE и using namespace MSXML2.
  3. Используйте CComPtr<IXMLDOMNode> pNode; без пространства имен.

Я видел много проектов, использующих ключевое слово import, чтобы попросить Visual C++ сгенерировать файл заголовка из TBL с использованием пространства имен MSXML2. Однако использование заголовка и ссылки на библиотеку — мой любимый способ избежать использования ключевого слова import, поскольку это не стандарт С++. Суть в том, чтобы не смешивать два подхода при обновлении старых проектов, что приведет к подобным проблемам.

person Samuel Zhang    schedule 26.01.2011
comment
Спасибо, проблема исправлена, проект компилируется! Должен сказать, что удаление как оператора «using», так и квалификатора «MSXML2::» кажется мне нелогичным, но с приближением крайнего срока я не жалуюсь. - person Nack; 26.01.2011