15.COM组件技术应用之一:ActiveX控件

一、ActiveX控件(COM组件技术的应用之一)

  flash.ocx  

  1. 概念

    1.1 ActiveX控件的概念

      基于COM组件技术,可以被任何支持COM标准的计算机程序的项目使用。

      可是采用拖拽的方式创建,使用向一般控件一样方便。文件的后缀是ocx,有时称ocx控件。

    1.2 COM组件的概念

      Component Object Model,组件对象模型。可以改善项目的架构,使得项目可维护性和可复用性更好。

      COM组件是一些小的可以执行的二进制文件,以接口的方式为其他的程序、系统和组件提供服务。

    1.3 COM接口的概念

      C语言 - 接口就是函数

      C++语言 - 接口就是公有的成员函数

      COM接口 - 一组纯虚函数的集合

      纯虚函数只有功能的描述,没有具体的实现过程。特点是稳定,不易变化。引入接口的目的是解耦。

      接口函数:public  void  Sort( int  arr[ ] );

      排序模块(小的dll程序):

        实现排序的组件:派生自接口的实现类。

      exe程序:

        另外一个模块调用排序模块实现了排序功能。

  2. 开发、注册、测试

    2.1 使用MFC向导开发ActiveX控件

      2.1.1 生成的类和接口的介绍

          第一个接口 - 添加方法和属性

          第二个接口 - 添加事件

          App类 - 应用程序类

          Ctrl类 - 控件类,完成控件外观的绘制以及控件功能的具体实现

          PropPage类 - 属性页类,添加控件的属性和设置

      2.1.2 在Ctrl::OnDraw函数中完成控件的外观

      2.1.3 通过第一个接口添加方法和属性

          在类视图窗口中,右击类名-->添加-->添加事件

          添加方法:SetNumbers

          添加属性:Direction       

      2.1.4 通过第二个接口添加事件

          在类视图窗口中,右击类名-->添加-->添加函数、添加变量

          事件分为库存事件和用户自定义事件

          库存事件:Click、DblClick等

          用户自定义事件:MyMessage

          库存事件自动通知的,只需添加事件即可。而用户自定义事件在添加事件后,需要在相应的位置调用。

    2.2 注册

      微软提供了一个注册工具regsvr32.exe完成控件注册,在运行框中输入命令

        注册控件:regsvr32   组件所在路径

        卸载控件:regsvr32  /u  组件所在路径

        

    2.3 测试

      在开发过程中以及开发完成之后都可以使用ActiveX Control Test Container工具测试控件,Edit-->Insert New Control

      

  3. 使用★★★

    3.1 在窗口程序中使用

      右击窗口对话框的空白处,选择Insert ActiveX Control菜单,弹出插入控件对话框,选择控件即可。

      打开类向导对话框,为控件绑定成员变量即可,像使用一般控件一样使用ActiveX控件。

      添加编辑框和按钮,完成相关功能

      先关代码:按钮中点击消息的处理   

void CT45_UseMcdDlg::OnBnClickedCalculate()
{
    UpdateData(TRUE);
    m_wndMcd.SetNumbers(m_nNum1, m_nNum2);
}

void CT45_UseMcdDlg::OnBnClickedDirection()
{
    m_wndMcd.SetDirection(!m_wndMcd.GetDirection());
}

void CT45_UseMcdDlg::OnBnClickedAbout()
{
    m_wndMcd.AboutBox();
}

    运行结果:     

       

      

    3.2 在html页面中使用

     (1)ocx控件对应的是<object>标签

     (2)在标签中设置ocx空间的额clsid

     (3)在开发控件过程中,双击任何一个借口打开idl文件,在文件中找coclass,在关键字上面的描述块[]中,

           uuid就是控件id,即clsid

二、COM的数据类型

  1. BSTR - 字符串类型

    1.1 使用基本函数

      #include  <altbase.h>

      使用前创建 - SysAllocString

      使用后释放 - SysFreeString

      基本函数的使用比较繁琐,为了简化操作,对BST类型的操作提出了封装类

    1.2 使用BSTR的封装类

      微软在ATL库中提供的封装类 - CComBSTR类

      标准C++提供的封装类 - _bstr_t类

      在封装类的构造函数包含了创建,在析构函数中包含了释放函数,还提供一些列操作字符串的函数。

  2. VARIANT - 可变类型

    本质上是一个结构体,包括类型和值两部分。

    typedef  struct  FARSTRUCT  tagVARIANT  VARIANT;

    typedef  struct  FARSTRUCT  tagVARIANT  VARIANTARG;

    typedef  struct  tagVARIANT

    {

      VARTYPE  vt;                          //表示类型

      unsigned  short  wReserved1;  //保留值

      unsigned  short  wReserved2;  //保留值

      unsigned  short  wReserved2;  //保留值

      union { ...... };                       //联合,表示各种不同类型的值

    };

    ATL库的封装类 - CComVariant

    标准C++的封装类 - _variant_t

  相关代码: 

#include "stdafx.h"
#include <atlbase.h>//微软atl库
#include <comdef.h>//标准c++库


//1 COM的字符串类型
void TestBSTR()
{
    //1 创建字符串
    BSTR bstrText = SysAllocString(L"Hello");
    //2 使用
    //......
    //3 释放字符串
    SysFreeString(bstrText);

    //4 封装类的使用
    CComBSTR bstrText2("Hello");
    printf("字符串长度:%d
", bstrText2.Length());

    _bstr_t bstrText3("Hello");
    printf("字符串长度:%d
", bstrText3.length());
}

//2 可变类型
void Vaiant()
{
    //1 使用可变类型表示整数100
    VARIANT varInt;
    varInt.vt = VT_I4;
    varInt.lVal = 100;

    //2 使用可变类型表示指向一个整数值的指针
    long nValue = 125;
    VARIANT varIntPtr;
    varIntPtr.vt = VT_BYREF | VT_I4;
    varIntPtr.plVal = &nValue;

    //3 封装类的使用
    CComVariant varInt2(100);
    _variant_t varInt3((long)100);
}

int _tmain(int argc, _TCHAR* argv[])
{
    TestBSTR();
    Vaiant();
    return 0;
}

   

原文地址:https://www.cnblogs.com/csqtech/p/5745082.html