интерфейсы IXMLDocument, IStream...

Hello comp,
занялся я такой штукой как использование интерфейсов IXMLDocument,
IXMLElement и IXMLElementCollection для парсинга XML файлов (цель -
- организация базы данных на XML и использование ее в программе на
С++). Основа этого фрагмента кода взята из msdn98 (в письме я вырезал
все проверки hr для краткости):
HRESULT hr;
IXMLDocument *pDoc = NULL;
IStream *pStm = NULL;
IPersistStreamInit *pPSI = NULL;
IXMLElement *pElem = NULL;
IXMLElementCollection *pColl = NULL;
BSTR bstr;
hr = CoInitialize(NULL);
// Create an empty XML document.
hr = CoCreateInstance(CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER,
IID_IXMLDocument, (void**)&pDoc);
// Synchronously create a stream on a URL.
hr = URLOpenBlockingStream(0, "c:\\test.xml", &pStm, 0,0);
// Get the IPersistStreamInit interface to the XML doc.
hr = pDoc->QueryInterface(IID_IPersistStreamInit, (void **)&pPSI);
// Init the XML doc from the stream.
hr = pPSI->Load(pStm);
// читаем корень
hr = pDoc->get_root(&pElem);
hr = pElem->get_tagName(bstr);
// ...дальше выводим, все правильно...
// меняем корень
SysFreeString(bstr);
bstr = SysAllocString(L"новое имя корня XML документа");
hr = pElem->put_tagName(bstr);
// ...выводим еще раз - действительно поменялся...
// !!! пытаемся сохранить - ошибка (hr отрицательное)
hr = pPSI->Save(pStm,0);
// Release any used interfaces.
// ...
все работает, только не происходит запись в файл xml. Если кто
работал с этими интерфейсами, подскажите плиз, что это за "потоки",
(IStream, IPersistStreamInit), как с ними работать и что делать
чтобы происходила запись в файл.
И еще: при попытке объявить указатели на интерфейсы как
переменные-члены класса визуалка выдала ошибку - типа нельзя. Как с
этим бороться, я же не могу все делать в одной функции!