COM应用总结(2/3) c++实例和部署

简介: 接着把这个总结继续。 实例 以常用的HTML文档的处理为例,深入地描述一下COM的使用,其他的类别使用类同(如Office的编程对象) 首先工程包含 #include 具体的代码如下: //以DOM对象的形式遍历HTML文档 int WalkTree(CComPtr domNode) ...

接着把这个总结继续。

实例

以常用的HTML文档的处理为例,深入地描述一下COM的使用,其他的类别使用类同(如Office的编程对象)

首先工程包含

#include <mshtml.h>

具体的代码如下:

//以DOM对象的形式遍历HTML文档
int WalkTree(CComPtr<IHTMLDOMNode> domNode)
{
    ASSERT(domNode!=NULL);

    long type;
    CComBSTR tag;
    if(domNode->get_nodeType(&type)==S_OK)
    {
        switch(type)
        {
        case 1://MSXML::NODE_ELEMENT:
            {
                // Get the element name and set the tag name...
                if(SUCCEEDED(domNode->get_nodeName(&tag)) )
                {
                    ///查到 <a ... 这样的元素                    if(wcscmp(tag.m_str, L"A")==0)
                    {
                        CComPtr<IDispatch> pDisp;
                        domNode->get_attributes(&pDisp);

                        CComQIPtr<IHTMLAttributeCollection, &IID_IHTMLAttributeCollection> pAttrs;
                        pAttrs = pDisp;
                        pDisp = NULL;

                        long l;
                        COleVariant index;
                        index.vt = VT_I4;
                        pAttrs->get_length(&l);
                        for (long i = 0; i < l; i++)
                        {
                            pDisp = NULL;
                            index.lVal = i;
                            pAttrs->item(index, &pDisp);

                            ///查询接口 也可用 CComQIPtr
                            CComPtr<IHTMLDOMAttribute> phref;
                            if(SUCCEEDED(pDisp->QueryInterface(IID_IHTMLDOMAttribute, (void**)&phref)) )
                            {
                                VARIANT_BOOL vbSpecified;
                                phref->get_specified(&vbSpecified);
                                if(VARIANT_TRUE==vbSpecified)
                                {
                                    CComBSTR text;
                                    if(SUCCEEDED(phref->get_nodeName(&text)) )
                                    {
                                        ///You can do...
                                    }

                                    COleVariant v;
                                    if(SUCCEEDED(phref->get_nodeValue(&v)) )
                                    {
                                        ///You can do...
                                    }
                                }
                            }
                        }
                    }
                }           

                CComPtr<IHTMLDOMNode> pChild;
                if(domNode->get_firstChild(&pChild)==S_OK)
                {
                    // If we have children, loop through and handle each one...
                    if (pChild)
                    {
                        // Recurse for all the children of this tag...
                        CComPtr<IHTMLDOMNode> domChild;
                        while (pChild)
                        {
                            WalkTree(pChild);

                            domChild=NULL;
                            domChild=pChild;
                            pChild=NULL;
                            domChild->get_nextSibling(&pChild);
                        }
                    }
                }
                break;
            }
        case 3://MSXML::NODE_TEXT:
            {
                COleVariant val;
                if(domNode->get_nodeValue(&val)==S_OK)
                {
                    ///You can do...
                }
            }
            break;
        }
    }

    return 0;
}

void CBrowserDomDlg::OnBnClickedOk()
{
    CComPtr<IDispatch> pDisp;
    pDisp = m_Web.get_Document();

    CComQIPtr<IHTMLDocument2, &IID_IHTMLDocument2> pHTML;
    pHTML = pDisp;

    ///可以查看HTML的 title内容
    CComBSTR bstrTitle;
    if(pHTML!=NULL && pHTML->get_title(&bstrTitle)==S_OK)
    {
        //title is
    }

    CComPtr<IHTMLElementCollection> pElems;
    HRESULT hr;

    pHTML->get_all(&pElems);
    if(pElems==NULL) return;
    long l;
    if(!SUCCEEDED(pElems->get_length(&l)) )
        return;

    //遍历元素找到BODY节点
    CComPtr<IHTMLElement> htmlBody;   
    COleVariant index;
    for(int i=0;i<l;i++)
    {
        CComPtr<IDispatch> pChild;

        index.vt = VT_I4;
        index.lVal = i;

        hr=pElems->item(index,index ,&pChild);
        htmlBody=NULL;
        if(SUCCEEDED(hr) && SUCCEEDED(pChild.QueryInterface(&htmlBody)) && htmlBody!=NULL)
        {
            CComBSTR name;
            hr=htmlBody->get_tagName(&name);
            if(wcscmp(name.m_str, L"BODY")==0)
                break;
        }
    }

    if(htmlBody==NULL) return;

    CComPtr<IHTMLDOMNode>pDOM;
    htmlBody->QueryInterface(&pDOM);

    if(pDOM==NULL) return;

    WalkTree(pDOM);
}

还有我们在应用中常用的ADO数据存取的方式:

#import   "C:\Program   Files\common   files\system\ado\msado15.dll "   no_namespace   rename( "EOF ", "EndOfFile ")   rename( "BOF ", "FirstOfFile ")

_RecordsetPtr   m_pRs;

具体的操作和以上的例子类似

部署

一般的COM组件都是C++开发的[因为现在.net提供了更好的实现形式,单纯使用COM的时机少了很多],部署时只要注意对应的MFC库和ATL库的设置即可

部署有两个形式[在项目编译选项设置]

静态链接

把MFC和ATL静态链接到组件中

[减少了部署的麻烦,组件的大小比动态连接大]

如项目就一个COM组件,那这种形式最好

动态连接

此时部署有两个方法:

1、 安装对应版本的MFC和ATL发行库[VS就包含]

2、 把Microsoft.VC**.CRT Microsoft.VC**.MFC Microsoft.VC**.ATL 这些需要的目录和其中的文件放在和组件库相同的地方即可

全部的实例代码参见:

http://cid-56b433ad3d1871e3.office.live.com/self.aspx/.Public/ComTutorial.zip

相关文章
|
8天前
|
算法 Serverless 数据处理
从集思录可转债数据探秘:Python与C++实现的移动平均算法应用
本文探讨了如何利用移动平均算法分析集思录提供的可转债数据,帮助投资者把握价格趋势。通过Python和C++两种编程语言实现简单移动平均(SMA),展示了数据处理的具体方法。Python代码借助`pandas`库轻松计算5日SMA,而C++代码则通过高效的数据处理展示了SMA的计算过程。集思录平台提供了详尽且及时的可转债数据,助力投资者结合算法与社区讨论,做出更明智的投资决策。掌握这些工具和技术,有助于在复杂多变的金融市场中挖掘更多价值。
37 12
|
1月前
|
编译器 数据安全/隐私保护 C++
【C++面向对象——继承与派生】派生类的应用(头歌实践教学平台习题)【合集】
本实验旨在学习类的继承关系、不同继承方式下的访问控制及利用虚基类解决二义性问题。主要内容包括: 1. **类的继承关系基础概念**:介绍继承的定义及声明派生类的语法。 2. **不同继承方式下对基类成员的访问控制**:详细说明`public`、`private`和`protected`继承方式对基类成员的访问权限影响。 3. **利用虚基类解决二义性问题**:解释多继承中可能出现的二义性及其解决方案——虚基类。 实验任务要求从`people`类派生出`student`、`teacher`、`graduate`和`TA`类,添加特定属性并测试这些类的功能。最终通过创建教师和助教实例,验证代码
57 5
|
7月前
|
存储 C++ Cloud Native
云原生部署问题之C++ 中的 nullptr 和 NULL 区别如何解决
云原生部署问题之C++ 中的 nullptr 和 NULL 区别如何解决
76 0
|
4月前
|
存储 并行计算 安全
C++多线程应用
【10月更文挑战第29天】C++ 中的多线程应用广泛,常见场景包括并行计算、网络编程中的并发服务器和图形用户界面(GUI)应用。通过多线程可以显著提升计算速度和响应能力。示例代码展示了如何使用 `pthread` 库创建和管理线程。注意事项包括数据同步与互斥、线程间通信和线程安全的类设计,以确保程序的正确性和稳定性。
|
4月前
|
存储 编译器 C++
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
109 2
|
5月前
|
编译器 C++
【C++核心】函数的应用和提高详解
这篇文章详细讲解了C++函数的定义、调用、值传递、常见样式、声明、分文件编写以及函数提高的内容,包括函数默认参数、占位参数、重载等高级用法。
47 3
|
6月前
|
存储 算法 C++
C++ STL应用宝典:高效处理数据的艺术与实战技巧大揭秘!
【8月更文挑战第22天】C++ STL(标准模板库)是一组高效的数据结构与算法集合,极大提升编程效率与代码可读性。它包括容器、迭代器、算法等组件。例如,统计文本中单词频率可用`std::map`和`std::ifstream`实现;对数据排序及找极值则可通过`std::vector`结合`std::sort`、`std::min/max_element`完成;而快速查找字符串则适合使用`std::set`配合其内置的`find`方法。这些示例展示了STL的强大功能,有助于编写简洁高效的代码。
83 2
|
6月前
|
存储 搜索推荐 Serverless
【C++航海王:追寻罗杰的编程之路】哈希的应用——位图 | 布隆过滤器
【C++航海王:追寻罗杰的编程之路】哈希的应用——位图 | 布隆过滤器
55 1
|
7月前
|
程序员 编译器 C语言
云原生部署问题之C++中的nullptr相比C语言中的NULL优势如何解决
云原生部署问题之C++中的nullptr相比C语言中的NULL优势如何解决
68 10
|
7月前
|
安全 编译器 C++
C++一分钟之-模板元编程实例:类型 traits
【7月更文挑战第15天】C++的模板元编程利用编译时计算提升性能,类型traits是其中的关键,用于查询和修改类型信息。文章探讨了如何使用和避免过度复杂化、误用模板特化及依赖特定编译器的问题。示例展示了`is_same`类型trait的实现,用于检查类型相等。通过`add_pointer`和`remove_reference`等traits,可以构建更复杂的类型转换逻辑。类型traits增强了代码效率和安全性,是深入C++编程的必备工具。
116 12