Столкнулся с задачей требующей использования XML. ВОзникла следующая проблема - функция put_text возвращает ошибку | Код | void CMxwlDataList::SaveData(void) { MSXML::IXMLDOMNode* rootNode=NULL; MSXML::IXMLDOMNode* pNode=NULL; MSXML::IXMLDOMDocument* document = NULL; MSXML::IXMLDOMParseError* parseError = NULL; MSXML::IXMLDOMElement* element = NULL; VARIANT var, nodeValue; HRESULT hr;
CString progName, path; char lp[1000]; progName="hr.exe"; GetModuleFileName(GetModuleHandle(NULL), lp, 1000 ); path=lp; path.Delete(path.Find(progName, 0),progName.GetLength()); int i=0;
CoUninitialize(); hr = CoInitialize(NULL); if (!FAILED(hr)) { hr = CoCreateInstance(MSXML::CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, MSXML::IID_IXMLDOMDocument, (LPVOID*)&document); if (document) { BSTR bstr = NULL; document->put_async(VARIANT_FALSE); bstr = m_XMLPath.AllocSysString();
VARIANT_BOOL vb; VARIANT vURL; vURL.vt = VT_BSTR; V_BSTR(&vURL) = bstr; document->load(vURL,&vb); if(vb!=VARIANT_TRUE) { MSXML::IXMLDOMParseError *pXMLError = NULL; LONG errorCode = E_FAIL; BSTR bstrErr = NULL;
document->get_parseError(&pXMLError); pXMLError->get_errorCode(&errorCode); pXMLError->get_reason(&bstrErr); } else { int count = this->GetPropertyCount(); for(long l = 0; l < count; l++) { CString name, value, type; CBCGPProp* pSubProp = this->GetProperty(l); type = "//"; type += pSubProp->GetType(); type += "/"; name = pSubProp->GetName(); value = "fuck";//pSubProp->GetValue(); document->selectSingleNode(type.AllocSysString(), &pNode); if(pNode) { hr = pNode->put_text(value.AllocSysString()); if(FAILED(hr)) { MSXML::IXMLDOMParseError *pXMLError = NULL; LONG errorCode = E_FAIL; BSTR bstrErr = NULL;
document->get_parseError(&pXMLError); pXMLError->get_reason(&bstrErr); pXMLError->get_errorCode(&errorCode); } } GetChildData(pSubProp, document, type, rootNode); } } VariantInit(&var); V_BSTR(&var) = path+SysAllocString(L"MXWLData\\myData.mxwl"); V_VT(&var) = VT_BSTR; document->save(var); SysFreeString(bstr); } } }
void CMxwlDataList::GetChildData(CBCGPProp* pCurProp, MSXML::IXMLDOMDocument* document, CString XPath, MSXML::IXMLDOMNode* rootNode) { MSXML::IXMLDOMNode* pNode=NULL; MSXML::IXMLDOMElement* element = NULL; MSXML::IXMLDOMParseError* parseError = NULL; HRESULT hr = S_OK; VARIANT nodeValue;
int count = pCurProp->GetSubItemsCount(); for(long l = 0; l < count; l++) { CString name, value, type; CBCGPProp* pSubProp = pCurProp->GetSubItem(l); type = XPath + pSubProp->GetType()+"/"; name = pSubProp->GetName(); value = pSubProp->GetValue(); document->selectSingleNode(type.AllocSysString(), &pNode); if(pNode) { hr = pNode->put_text(value.AllocSysString()); if(FAILED(hr)) { MSXML::IXMLDOMParseError *pXMLError = NULL; LONG errorCode = E_FAIL; BSTR bstrErr = NULL;
document->get_parseError(&pXMLError); pXMLError->get_reason(&bstrErr); pXMLError->get_errorCode(&errorCode); } } GetChildData(pSubProp, document, type, rootNode); } }
| Импорт делал как | Код | #import <msxml.dll> named_guids raw_interfaces_only
|
|