24
1 十十 ActiveX Control 1. ActiveX 十十 1. 十十十十 2. 十十十 3. 十十十十十十 2. ActiveX 十十十十十 3. ActiveX 十十十 Internet 4. 十十十十十

十七 ActiveX Control

  • Upload
    iokina

  • View
    188

  • Download
    13

Embed Size (px)

DESCRIPTION

十七 ActiveX Control. ActiveX 控件 实地激活 属性页 属性变化通知 ActiveX 控件包容器 ActiveX 控件与 Internet 许可证管理. Windows 控件 (各种鼠标,键盘,系统事件). COM 对象 (接口规范). ActiveX 控件. ActiveX 控件是一个 1. COM 对象, 2.自动化对象, 3.界面元素. ActiveX 控件不仅用在桌面环境,同时用在 Internet 环境. Web 服务器不仅提供客户感兴趣的数据,同时把执行代码也传递给客户.使得客户可以按照各种方式来操纵这些数据. - PowerPoint PPT Presentation

Citation preview

Page 1: 十七  ActiveX Control

1

十七 ActiveX Control1. ActiveX 控件

1. 实地激活2. 属性页3. 属性变化通知

2. ActiveX 控件包容器3. ActiveX 控件与 Internet4. 许可证管理

Page 2: 十七  ActiveX Control

2

ActiveX 控件是一个 1.COM 对象 , 2. 自动化对象 , 3. 界面元素 . ActiveX 控件不仅用在桌面环境 , 同时用在 Internet 环境 . Web 服务器不仅提供客户感兴趣的数据 , 同时把执行代码也传递给客户 .使得客户可以按照各种方式来操纵这些数据 .

Windows 控件( 各种鼠标 , 键盘 , 系统事件 )

COM 对象( 接口规范 )

ActiveX 控件

Page 3: 十七  ActiveX Control

3

功能要求 使用的技术 属性和方法管理 自动化 属性变化通知 (包括可连接对象机制)

事件管理 自动化 可连接对象 (以 IDispatch 作为出接口 )

用户界面特性(可视性) 实地激活、OLE 嵌入对象 可视对象 ( 实现了接口 IViewObject2) 统一数据传输

状态永久性机制 结构化存储 永久对象

ActiveX 控制相关技术列表

Page 4: 十七  ActiveX Control

4

ActiveX 控制结构

ActiveX控制

ISpecifyPropertyPages

IOleObject

IOleInPlaceObject

IOleInPlaceActiveObject

IDataObject

IViewObject2

IPersistXXX

IRunnableObject

IConnectionPointContainer

IDispatch

IProvideClassInfo

IOleControl

类厂对象

IClassFactory或 IClassFactory2

类型库

实地激活数据对象

支持属性页

可视化永久化

可连接出接口

提供类型信息

Page 5: 十七  ActiveX Control

5

实地激活 (in-place activation) 实地激活是指 OLE 对象的一种界面特性,具有实地激活特性的对象可以直接在包容器窗口内部进行编辑

– 也被称作实地编辑 (in-place editing)或可视编辑 (visual editing) 界面处理 菜单合并、工具条、快捷键 消息发送、焦点控制 鼠标消息、键盘消息 窗口大小和位置调整 ActiveX Control 可以有所简化

Page 6: 十七  ActiveX Control

6

属性页 (Property Page) 例子

Page 7: 十七  ActiveX Control

7

客户、属性表、属性页和对象之间的结构关系

客户

属性表(属性框架)

有模式对话框

页站点 页站点 页站点

属性页 属性页 属性页

对象对象

OleCreatePropertyFrame

IPropertyPageSite

IPropertyPage

ISpecifyPropertyPages

IUnknown

Page 8: 十七  ActiveX Control

8

属性页技术 COM 对象 COM 对象如果要支持属性页特性,那么它必须实现

ISpecifyPropertyPages 接口class ISpecifyPropertyPages : IUnknown{ HRESULT GetPages(CAUUID *pPages) = 0; };

客户程序 : OleCreatePropertyFrameSTDAPI OleCreatePropertyFrame(HWND hWndOwner,

UINT x, UINT y,LPCOLESTR lpszCaption, ULONG cObjects, IUnknown **lplpUnk,ULONG cPages, CLSID *lpPages, LCID lcid, DWORD dwReserved, LPVOID pvReserved);

Page 9: 十七  ActiveX Control

9

属性页对象 IPropertyPage : public IUnknown { public: virtual HRESULT SetPageSite(IPropertyPageSite

*pPageSite) = 0;virtual HRESULT Activate(HWND hWndParent, LPCRECT

pRect,BOOL bModal) = 0;virtual HRESULT Deactivate( void) = 0;virtual HRESULT GetPageInfo(PROPPAGEINFO *pPageInfo) = 0; virtual HRESULT SetObjects(ULONG cObjects, IUnknown **ppUnk) =

0;virtual HRESULT Show( UINT nCmdShow) = 0;virtual HRESULT Move( LPCRECT pRect) = 0; virtual HRESULT IsPageDirty( void) = 0; virtual HRESULT Apply( void) = 0; virtual HRESULT Help(LPCOLESTR pszHelpDir) = 0;virtual HRESULT TranslateAccelerator( MSG *pMsg) = 0; };

Page 10: 十七  ActiveX Control

10

属性页技术——属性页站点对象class IPropertyPageSite : public IUnknown{ HRESULT OnStatusChange(DWORD flags) = 0; HRESULT GetLocaleID(LCID *pLocaleID) = 0; HRESULT GetPageContainer(IUnknown **ppUnk) = 0; HRESULT TranslateAccelerator(LPMSG pMsg) = 0;}; 属性变化通知 使用了可连接对象机制,出接口为class IPropertyNotifySink : public IUnknown{ HRESULT OnChanged(DISPID dispid) = 0; HRESULT OnRequestEdit(DISPID dispid) = 0;};

Page 11: 十七  ActiveX Control

11

ActiveX 控制包容器相关技术列表

功能要求 使用的技术布局特性 OLE 复合文档

OLE 拖-放机制永久特性 结构化存储永久对象包容器环境属性 自动化控制站点对象事件机制 自动化可连接对象包容器扩展控制 包容和聚合两种重用模型键盘功能 IOleControl 和 IOleControlSite 接口

Page 12: 十七  ActiveX Control

12

包容器基本结构

框架对象

文档窗口对象

IUnknown

IOleInPlaceFrame

IOleInPlaceUIWindow

IOleClientSite

IOleInPlaceSite

IAdviseSink

IOleControlSite

IDispatch ( 暴露环境属性)

IPropertyNotifySink

控制站点对象

事件接收器 IDispatch (出接口,响应事件)

实现界面合并 ,( 菜单 , 工具条等 )

一个或多个文档窗口管理文档窗口的边框 ,用于工具条的处理

实地激活

数据对象数据改变通知属性改变通知

Page 13: 十七  ActiveX Control

13

接口选择接口 功能与说明

IOleObject 如果控制要与包容器程序的站点对象进行通讯,那么必须实现此接口。IOleInPlaceObjectIOleInPlaceActiveObject 如果控制支持实地激活特性,那么必须实现此接口。IOleControl 如果控制支持快捷键,或者访问包容器的环境属性,或者控制要求包容器处理事件,那么必须实现此接口。IDataObject 如果控制提供数据对象的特性,那么必须实现此接口。IViewObject2 如果控制在非实地激活的状态下也需要显示信息的话,那么必须实现此接口。IDispatch 如果控制有自定义的属性和方法的话,那么必须实现此接口。IConnectionPointContainer 如果控制对象支持一个或多个出接口,那么必须实现此接口。IProvideClassInfo[2] 如果控制对象要直接通过GetClassInfo成员函数提供对象类型信息的话,那么必须实现此接口。ISpecifyPropertyPages 如果控制对象支持属性页特性的话,那么必须实现此接口。IPersistStream[Init]IPersistStorage或其它永久接口 如果控制对象支持永久特性的话,那么至少实现一个永久接口。

Page 14: 十七  ActiveX Control

14

ActiveX 控制与 Internet 从桌面环境转向 Internet 包装 ActiveX 控制 许可证管理 Web 页面中 ActiveX 控制的初始化 脚本支持与初始化安全性 Internet 环境带来的问题1. 网络传输2. 安全性3. 包容器如何管理、发布

Page 15: 十七  ActiveX Control

15

示例

Page 16: 十七  ActiveX Control

16

HTML 代码描述<HTML><HEAD><TITLE>ATL 3.0 test page for object PolyCtl</TITLE></HEAD><BODY><OBJECT ID="PolyCtl" CLASSID="CLSID:2885EE05-A26B-11D1-B49B-00C04F98EFE0"></OBJECT><SCRIPT LANGUAGE="VBScript"><!--Sub PolyCtl_ClickIn(x, y) PolyCtl.Sides = PolyCtl.Sides + 1End SubSub PolyCtl_ClickOut(x, y) PolyCtl.Sides = PolyCtl.Sides - 1End Sub--></SCRIPT></BODY></HTML>

Page 17: 十七  ActiveX Control

17

ActiveX 控制的发布 以上方法需要客户端机器上注册了此组件 . 以下方法更加合理 : 客户 - 服务器协调控制 例子一:

<OBJECT CLASSID="CLSID:2885EE05-A26B-11D1-B49B-00C04F98EFE0"

codebase="http://webserver/Polygon.dll" ALIGN="CENTER" WIDTH=200 HEIGHT=200 ID="PolyCtl"> </OBJECT>

IE 自动下载到“ Downloaded Program Files”目录中并注册到客户机上

Page 18: 十七  ActiveX Control

18

ActiveX 控制的包装 例子二:

<OBJECT CLASSID="CLSID:2885EE05-A26B-11D1-B49B-00C04F98EFE0"

codebase="http://webserver/Polygon.cab" ALIGN="CENTER" WIDTH=200 HEIGHT=200 ID="PolyCtl"> </OBJECT>

CAB 文件,压缩代码提高传输效率 CAB 文件可包含多个代码文件

Page 19: 十七  ActiveX Control

19

IE 对 CAB 文件的处理过程 IE 在解析“ OBJECT” 标记时,它继续查找 codebase 属性 如果 codebase 指定了 ActiveX 控制的 CAB 文件,那么 IE 定位

到 CAB 文件 IE 把 CAB 文件中的有关文件解压出来,并放到 “ Downloaded

Program Files” 子目录中 IE注册有关的文件 IE 调用 COM API 函数创建 ActiveX 控制对象 CAB 文件 包含了 ActiveX 控制注册和运行所需要的必要信息 CAB 文件包含一个 INF 文件, INF 文件是一个文本文件,它描述了 CAB 文件的所有细节信息 CAB 文件的制作

– cabarc.exe N polygon.cab atl.dll polygon.dll \ polygon.inf– 支持数字签名

Page 20: 十七  ActiveX Control

20

Polygon 控制的 INF 文件[version] signature="$CHICAGO$" AdvancedINF=2.0[Add.Code] polygon.dll=polygon.dll atl.dll=atl.dll[atl.dll] file-win32-x86=thiscab FileVersion=3,00,0,8166 DestDir=11 RegisterServer=yes[polygon.dll] file-win32-x86=thiscab clsid={2885EE05-A26B-11D1-B49B-00C04F98EFE0} FileVersion=1,0,0,1 RegisterServer=yes

Page 21: 十七  ActiveX Control

21

许可证管理typedef struct tagLICINFO{ULONG cbLicInfo;BOOL fRuntimeKeyAvail;BOOL fLicVerified;} LICINFO; IClassFactory2 : public IClassFactory { public:virtual HRESULT GetLicInfo(LICINFO *pLicInfo) = 0;virtual HRESULT RequestLicKey( DWORD dwReserved,BSTR *pBstrKey) = 0; virtual HRESULT CreateInstanceLic( IUnknown *pUnkOuter,IUnknown *pUnkReserved,REFIID riid,BSTR bstrKey,PVOID

*ppvObj) = 0; };

Page 22: 十七  ActiveX Control

22

许可证检查 设计时刻的许可证检查由 ActiveX 控制的包容器程序完成 在运行时刻,不同的包容器程序对 ActiveX 控制的许可证检查方法有所不同。以 VB 为例 :

– ( 1)创建应用程序时刻 (build)– ( 2)在运行应用程序时刻

IE 的处理有所不同 IE 包含一个许可证管理器组件 Microsoft引进了许可证包文件 (license package file ,后缀为

LPK) IE 的许可证管理器组件负责解析 LPK 文件,并提取出每个

CLSID 的许可证 然后调用 IClassFactory2::CreateInstanceLic 函数创建 ActiveX控制对象

Page 23: 十七  ActiveX Control

23

ActiveX 控制开发和应用 VC集成环境的支持:

– AppWizard 和 ClassWizard 、– ActiveX Control Test Containner

MFC——COleControl 类– 用 MFC 实现 ActiveX 控制– 用 MFC 实现 ActiveX 控制包容器

ATL VB

Page 24: 十七  ActiveX Control

24

COM 技术总体结构

COM 基础Typelib

结构化存储 可连接对象Automation

永久对象UDT

moniker

属性页 事件 属性变化通知

ActiveX Control

OLE 嵌入对象In-place activate