Аннотация:
В этой статье автор на простом примере демонстрирует применение парсера MSXML для работы с XML-документами (загрузка и сохранение документа, поиск, изменение и добавление узлов, получение и изменение атрибутов). Для работы с MSXML используются средства библиотеки ATL.
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...
будут детально описаны основные интерфейсы и их методы.
Меня на данный момент интересует пример создание пустого документа сохранение туда таблиц
и потом восстановление этих таблиц.
Это когданибуть будет?
Пример (как есть) — не компилируется.
Надо добавить в установках проекта
Additional include directories:
C:\Program Files\Microsoft XML Parser SDK\inc
и подключить заголовочный файл:
#include <msxml2.h> а не msxml.h
Другой путь — использовать:
#import <msxml4.dll>
using namespace MSXML2;
но тут надо будет исправлять код
(
hr = spXMLDOM->load(CComVariant(L"xmldata.xml"),&bSuccess);
на
varBool = docPtr->load( varFileName );
)
Такое сообщение возникает в VC7 (т.к. где-то в глубинах MFC7 используется директива "#include <msxml2.h>")
Чтобы этого избежать, надо просто указывать тип интерфейсног указателя (или smart-pointer'a) полностью: т.е. MSXML2::IXMLDOMNode или MSXML2::IXMLDOMNodePtr
1. в stdafx.h вместо
#include <msxml.h>
пишем
#import "msxml.dll" named_guids raw_interfaces_only
2. все обращения к интерфейсам XML парсера расширяем MSXML::
(например, вместо
CComPtr<IXMLDOMDocument> spXMLDOM;
записываем
CComPtr<MSXML::IXMLDOMDocument> spXMLDOM;
)
Здравствуйте, Аноним, Вы писали:
А>Пример (как есть) — не компилируется. А>Надо добавить в установках проекта А> Additional include directories: А> C:\Program Files\Microsoft XML Parser SDK\inc А>и подключить заголовочный файл: А>#include <msxml2.h> а не msxml.h А>Другой путь — использовать: А> #import <msxml4.dll> А> using namespace MSXML2; А>но тут надо будет исправлять код А>(
Проблема такая! Взял этот пример, и скопировал к себе в проект, оформил как функцию.
Проект является WinAPI DLL. Все скопилилось. Только виснет програ
try {
// Create an instance of the parser
CComPtr<IXMLDOMDocument> spXMLDOM;
HRESULT hr = spXMLDOM.CoCreateInstance(__uuidof(DOMDocument));
if ( FAILED(hr) ) throw"Unable to create XML parser object";
if ( spXMLDOM.p == NULL ) throw"Unable to create XML parser object";
на жирной строке. Пример работает нормально! В чем грабли?
Я вот все чаще думаю:
Все великие люди уже умерли...
Вот и я себя плохо чувствую!
Re[2]: Использование парсера MSXML для работы с XML-документ
Loaded 'C:\WINNT2K\system32\clbcatq.dll', no matching symbolic information found.
Loaded 'C:\WINNT2K\system32\msvcrt.dll', no matching symbolic information found.
Такое вот выдается в окне Debug когда програ повисает!
Я вот все чаще думаю:
Все великие люди уже умерли...
Вот и я себя плохо чувствую!
Re[2]: Использование парсера MSXML для работы с XML-документ
Здравствуйте, Kont, Вы писали:
K>Проблема такая! Взял этот пример, и скопировал к себе в проект, оформил как функцию. K>Проект является WinAPI DLL. Все скопилилось. Только виснет програ
K>на жирной строке. Пример работает нормально! В чем грабли?
Здравствуйте, OlegO, Вы писали:
OO>Здравствуйте, Kont, Вы писали:
K>>Проблема такая! Взял этот пример, и скопировал к себе в проект, оформил как функцию. K>>Проект является WinAPI DLL. Все скопилилось. Только виснет програ
K>>на жирной строке. Пример работает нормально! В чем грабли?
OO>CoInitialize не забыл вызвать?
Я скопировал весь код, без исключения, в свой проект. Соответственно и вызов CoInitialize!
Я вот все чаще думаю:
Все великие люди уже умерли...
Вот и я себя плохо чувствую!
Re[4]: Использование парсера MSXML для работы с XML-документ
Здравствуйте, OlegO, Вы писали:
OO>Здравствуйте, Kont, Вы писали:
K>>Я скопировал весь код, без исключения, в свой проект. Соответственно и вызов CoInitialize!
OO>Тогда вопрос: Где идет создание объекта в DLL? В какой функции?
Находится это в методе класса. Класс создается локальной переменной. Затем вызывается метод с этим кодом. И все.
Я вот все чаще думаю:
Все великие люди уже умерли...
Вот и я себя плохо чувствую!
Re[6]: Использование парсера MSXML для работы с XML-документ
Здравствуйте, Kont, Вы писали:
OO>>Тогда вопрос: Где идет создание объекта в DLL? В какой функции?
K>Находится это в методе класса. Класс создается локальной переменной. Затем вызывается метод с этим кодом. И все.
Возможно не так выразился, Вызов твоего кода случайно идет не в рамках DllMain, если да то надо вынести в отдельную ф-ю, потому-что возможно следующие:
Warning The entry-point function should perform only simple initialization or termination tasks.
It must not call the [msdn]LoadLibrary[/msdn] or [msdn]LoadLibraryEx[/msdn] function
(or a function that calls these functions), because this may create dependency loops in the
DLL load order. This can result in a DLL being used before the system has executed its initialization code.
Similarly, the entry-point function must not call the FreeLibrary function (or a function that calls FreeLibrary),
because this can result in a DLL being used after the system has executed its termination code.
С уважением, OlegO.
Re[7]: Использование парсера MSXML для работы с XML-документ
Здравствуйте, OlegO, Вы писали:
OO>Возможно не так выразился, Вызов твоего кода случайно идет не в рамках DllMain, если да то надо вынести в отдельную ф-ю, потому-что возможно следующие:
Вызов происходит в экспортируемой функции.
Я немного поэкспериментировал, и нашел особенность:
В этой функции создавались мои объекты и окна. Так вот оказалось, что вызов метода класса, работающего с COM, происходил после создания моих объектов и окон. Я перенес вызов в самое начало экспортируемой функции, в то место где еще ничего моего не создавалось, и все стало работать. Еще я вынес инициализацию/деинициализацию COM в конструктор/деструктор класса. А сам экземпляр класса обявляется глобально в DLL
EP_FILE_N1 xmlFN1;
Кто объяснит мне? Безопасно ли потом будет работать с COM? Смогу ли я работать в своих объектах с COM, не подвешивая программу?
Я вот все чаще думаю:
Все великие люди уже умерли...
Вот и я себя плохо чувствую!
Re: Использование парсера MSXML для работы с XML-документами
я прочитал статью о Использование парсера MSXML для работы с XML-документами.
скопировал её. но у меня есть проблема с запуском.
// Create an instance of the parser
CComPtr<IXMLDOMDocument> spXMLDOM;
HRESULT hr = spXMLDOM.CoCreateInstance(__uuidof(DOMDocument));
if ( FAILED(hr) ) throw "Unable to create XML parser object";
if ( spXMLDOM.p == NULL ) throw "Unable to create XML parser object
на первом же ифе программа заканчивается.
я не могу понять почему не получаетмся сделать инициализацию объекта.
PS
я скачал MSXML 4,0 и перенаправил прогу на её хедеры.