一、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; }