在VC中如何像VB那样引用msxml.dll

解决方案 »

  1.   

    http://www.swm.com.cn/rj/2001-1/26.htm
      

  2.   

    和普通的com组件没有差别。
    CoCreateInstance...
      

  3.   

    简单的实例程序
      #include < atlbase.h>
      //下面的.h文件是在安装了最新的XML Parser以后所包含的.h文件。
      #include "C:\Program Files\Microsoft XML Parser SDK\inc\msxml2.h"
      #include < iostream>
      void main()
      {
      // 初始化COM接口
      CoInitialize(NULL);
      //在程序中,我们假定我们装载的XML文件名称为xmldata.xml,它缺省的和可执行文
      //件在同一个目录中。该文件的内容如下:
      // < ?xml version="1.0"?>
      // < xmldata>
      // < xmlnode />
      // < xmltext>Hello, World!< / xmltext>
      // < /xmldata>
    //程序将寻找名为“xmlnode”的节点,然后插入一个新的名称为“xmlchildnode”的
      //节点,然后它去寻找一个名为“xmltest”的节点,然后提取包含在节点中的文本并显
      //示它。最后它把新的改变过的XML文档保存在名称为“updatexml.xml”的文档中。
      try {
      // 通过智能指针创建一个解析器的实例。
      CComPtr< IXMLDOMDocument> spXMLDOM;
      HRESULT hr = spXMLDOM.CoCreateInstance(__uuidof(DOMDocument));
      if ( FAILED(hr) ) throw "不能创建XML Parser对象";
      if ( spXMLDOM.p == NULL ) throw "不能创建XML Parser对象";
      // 如果对象创建成功的话,就开始装载XML文档
      VARIANT_BOOL bSuccess = false;
      hr = spXMLDOM->load(CComVariant(L"xmldata.xml"),&bSuccess);
      if ( FAILED(hr) ) throw "不能够在解析器中装载XML文档";
      if ( !bSuccess ) throw "不能够在解析器中装载XML文档";
      // 检查并搜索"xmldata/xmlnode"
      CComBSTR bstrSS(L"xmldata/xmlnode");
      CComPtr< IXMLDOMNode> spXMLNode;
      //用接口IXMLDOMDocument的方法selectSingleNode方法定位该节点
      hr = spXMLDOM->selectSingleNode(bstrSS,&spXMLNode);
      if ( FAILED(hr) ) throw "不能在XML节点中定位'xmlnode' ";
      if ( spXMLNode.p == NULL ) throw "不能在XML节点中定位'xmlnode' ";
      //DOM对象“spXMLNode”现在包含了XML节点< xmlnode>,所以我们可以在
      //它下面创建一个子节点并把找到的该节点作为它的父节点。
      CComPtr< IXMLDOMNode> spXMLChildNode;
      //用接口IXMLDOMDocument的方法createNode方法创建一个新节点。
      hr = spXMLDOM->createNode(
      CComVariant(NODE_ELEMENT),
      CComBSTR("xmlchildnode"),
      NULL,&spXMLChildNode);
      if ( FAILED(hr) ) throw "不能创建'xmlchildnode' 节点";
      if ( spXMLChildNode.p == NULL ) 
      throw "不能创建'xmlchildnode' 节点";
      //添加新节点到spXMLNode节点下去。
      CComPtr< IXMLDOMNode> spInsertedNode;
      hr = spXMLNode->appendChild(spXMLChildNode,&spInsertedNode);
      if ( FAILED(hr) ) throw "不能创建'xmlchildnode' 节点";
      if ( spInsertedNode.p == NULL ) throw "不能移动'xmlchildnode' 节点";
      //对新节点添加属性。
      CComQIPtr< IXMLDOMElement> spXMLChildElement;
      spXMLChildElement = spInsertedNode;
      if ( spXMLChildElement.p == NULL )
      throw "不能在XML元素接口中查询到'xmlchildnode' ";
      //设置新节点的属性
      hr = spXMLChildElement->setAttribute(CComBSTR(L"xml"),CComVariant(L"fun"));
     if ( FAILED(hr) ) throw "不能插入新的属性";
      //下面的程序段用来寻找一个节点并显示该节点的相关信息
      // 查找"xmldata/xmltext"节点
      spXMLNode = NULL; // 释放先前的节点
      bstrSS = L"xmldata/xmltext";
      hr = spXMLDOM->selectSingleNode(bstrSS,&spXMLNode);
      if ( FAILED(hr) ) throw "不能定位'xmltext'节点";
      if ( spXMLNode.p == NULL ) throw "不能定位'xmltext'节点";
      // 得到该节点包含的文本并显示它
      CComVariant varValue(VT_EMPTY);
      hr = spXMLNode->get_nodeTypedValue(&varValue);
      if ( FAILED(hr) ) throw "不能提取'xmltext'文本";
      if ( varValue.vt == VT_BSTR ) {
      // 显示结果,注意这里要把字符串从形式BSTR转化为ANSI
      USES_CONVERSION;
      LPTSTR lpstrMsg = W2T(varValue.bstrVal);
      std::cout < < lpstrMsg < < std::endl;
      } // if
      else {
      // 如果出现错误
      throw "不能提取'xmltext'文本";
      } // else
      //保存修改过的XML文档到指定的文档名
      hr = spXMLDOM->save(CComVariant("updatedxml.xml"));
      if ( FAILED(hr) ) throw "不能保存修改过的XML文档";
      std::cout < < "处理完成..." < < std::endl < < std::endl;
      } // try
      catch(char* lpstrErr) {
      // 出现错误
      std::cout < < lpstrErr < < std::endl < < std::endl;
      } // catch
      catch(...) {
      // 未知错误
      std::cout < < "未知错误..." < < std::endl < < std::endl;
      } // catch
      // 结束对COM的使用
      CoUninitialize();
     }
      

  4.   

    多谢各位,但我的意思是说如何MFC中向添加控件一样添加msxml.dll