`
zhaohaolin
  • 浏览: 1017366 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

COM组件开发实践(一)【转】

阅读更多

 Preface

      因为项目需要,开始从事 ActiveX 方面的工作,看了一些资料,可惜都是些 COM 原理方面的,没有切合实际动手的东西,在 CodeProject 上读完 David Marcionek的 文章【1】后,收获良多,但也遇到一些恼人的小问题, 因此在其基础上就一些易错点做些小注解。本文版权归 David Marcionek 所有。

简介  

本文目的在于让你快速掌握 ActiveX 控件开发技术,将会展示开发 ActiveX 应该知道的基本概念,如方法,属性和事件,以及如何在一个 ActiveX 控件和一个 web 页面之间进行通信

在本文中,我们将创建一个 ActiveX 控件,当加载控件时,它会显示一个动画进度条,以便向用户表明控件正在加载。此控件会包含展示如何在控件和 web 页面间传递信息的功能。下面我们会使用 VS2005 一步步进行开发的。

创建一个 ActiveX 控件

为了创建一个 ActiveX 控件,如下所示:

1, 创建一个 "MFC ActiveX Control" 项目,取名 MyActiveX,

2 ,在 "MFC ActiveX Control Wizard" 对话框中,选中 "Control Settings"

3, "Create control based on" 中选择 "STATIC". 我们将使用静态控件,因为我们只是显示从控件中获取的输出信息,并不接受输入信息。

4 ,在 "Additional features" 中,确保 "Activates when visible" "Flicker-free activation" 被选中, "Has an About box dialog" 不选中。

5 ,默认情况下, wizard 会创建一个项目,使其在一个共享 DLL 中使用 MFC. 我们必须更改这种情况,因为除非所需的 MFC DLL 都已经在系统中安装了,否则 ActiveX 控件 就不能运行。包含 ActiveX 控件的 Web 页面上出现红叉的一个原因就是此。在项目的属性中, "Configuration Properties"-->"General", “Use of MFC” 改为 “Use MFC in a Static Library”.

6 ,向导会创建如下几个类:

      1)CMyActiveXApp: 这是 ActiveX 应用程序类,从 COleControlModule 类继承下来的。它是 OLE 控件模块对象继承自的基类,包含了初始化 (InitInstance )和清理 (ExitInstance) 的代码

      2)CMyActiveXCtrl: COleControl 继承而来,这里是我们实现控件大部分功能的地方。

      3)CMyActiveXPropPage: COlePropertyPage 继承而来,用于管理控件的属性页对话框。向导已经为我们创建了一个默认的对话框来作为控件的属性页对话框。

增加动画 GIF 支持

      这里我们使用了一个 CPictureEx 类(具体代码见最后的 资源 部分), vs2005 增加一个动画 GIF 资源有一个 bug (其实在 vs2008 中也存在),我们可以使用下面这种技巧来回避它:

ProcessingProgressBar.gif 拷贝到项目文件夹下,然后更名为 ProcessingProgressBar.gaf 在资源视图中,右键资源文件 MyActiveX.rc, 选择 添加资源 。在 添加资源 对话框中,按下 导入 按钮,并选择 ProcessingProgressBar.gaf 文件。在 自定义资源类型 对话框中输入 “GIF” 作为资源类型。这就会将 GIF 图片文件导入项目中。然后将导入的图片 ID IDR_GIF1 改为 IDR_PROGRESSBAR .

现在开始着手恢复原状,首先,打开 MyActiveX.rc 的源文件,找到 IDR_PROGRESSBAR 的定义,将其文件名改为 ProcessingProgressBar.gif ”. 同样地,把项目文件夹下的图片文件名也改回为 “ProcessingProgressBar.gif”, 最后在 解决方案资源管理器 视图中,选中 ProcessingProgressBar.gaf ,在其 属性 中,修改 相对路径 ."ProcessingProgressBar.gif”.

增加对话框

      现在,我们为进度条图像增加一个对话框。

1,  资源 视图中,右键 对话框 ,选择 插入对话框 来创建一个默认的对话框。

2,  删除默认产生的 确定 取消 按钮,调整对话框大小为 230*40

3, 更改对话框 ID IDD_MAINDIALOG ,并修改对话框属性: Border—none, Style – Child, System Menu – False, Visible – True.

4, 在对话框中加入一个图片控件,调整其大小为 200*20 ,更改控件 ID IDC_PROGRESSBAR ,颜色为 “white”

5, 为对话框创建一个类,名为 CMainDialog,

 现在我们为类增加成员变量:

1, CMyActiveXCtrl 类增加一个变量 m_MainDialog ,类型为 CMainDialog

2,  CMainDialog 类增加一个变量 m_ProgressBar ,类型为 CPictureEx ,这里注意确保 控件变量 选中,并且对于的控件是 ”IDC_PROGRESSBAR”.

增加支持代码

好了,现在加入一些代码来绘制主对话框和进度条控件吧。

1 ,为 CMyActiveXCtrl 处理 WM_CREATE 事件的代码,在其中加入:

m_MainDialog.Create(IDD_MAINDIALOG,  this );

并在 OnDraw 函数中加入:

m_MainDialog.MoveWindow(rcBounds, TRUE);
CBrush brBackGnd(TranslateColor(AmbientBackColor()));
pdc
-> FillRect(rcBounds,  & brBackGnd);

     2. CMainDialog 类中,加入处理 WM_CREATE 事件的代码,在其中加入:

if (m_ProgressBar.Load(MAKEINTRESOURCE(IDR_PROGRESSBAR),_T( " GIF " )))
m_ProgressBar.Draw();

Ok, 一个简单的 ActiveX 控件已经开发完毕,设置编译模式为 “Release” 模式,并构建整个应用程序。

创建一个 Web 页面作为 ActiveX 控件容器

      可以使用微软的 ActiveX Control Pad 。要利用它在 Web 页面中插入一个 ActiveX 控件,在 <BODY> 标记中右键,选择 “Insert ActiveX Control”, 选择你需要的就可以了。

 直接打开 Web 页面或者放到 IIS 服务器上进行访问,一切顺利的话就可以看到下面的图像:  

注1:前面要求设置编译模式为“ Release” ,其实是为了避免运行时因为触及 Assert 出错而做的,否则会报错如下:

 跟踪调试后会发现:  

  可以看出是图片扩展控件加载时的顺序有些问题,但在浏览器中并不需要考虑如此多,因此这里忽略此 Assert 条件。

  2 :作 者在这里没有对 MyActiveX.idl 文件进行讲解,我认为是一个不小的失误,也正是因为如此,才会导致一个很容易犯错的地方,当我们按照他的教程,仿照他的代码一步步进行完后,却发现在 ActiveX 测试容器中是可以运行通过的,但到了浏览器中却死活都是红叉叉。。。,就是因为作者忽略了其对 MyActiveX.idl 接口定义文件的修改进行解释。

注3:VS2008中没有ActiveX控件测试容器了,VS05以上的数字签名工具也改变了,因此使用VS2005可能更好

     我按照教程一步步模仿着做的时候,在上面这两点上纠缠了3个多小时才发现问题的原因。

     在下一篇文章中,将介绍如何对 ActiveX 控件进行数字签名并使其自注册和销毁来确保其安全性,此外还会介绍如何在 ActiveX 控件和 Web 页面间进行数据通信。

参考资源

1 A Complete ActiveX Web Control Tutorial By David Marcionek

2. Add GIF-animation to your MFC and ATL projects with the help of CPictureEx and CPictureExWnd by Oleg Bykov, CodeProject.

 

作者:洞庭散人

出处:http://phinecos.cnblogs.com/     

本博客遵从Creative Commons Attribution 3.0 License ,若用于非商业目的,您可以自由转载,但请保留原作者信息和文章链接URL。

分享到:
评论

相关推荐

    Web前端工程化与组件化开发实践

    在现代Web开发中,"Web前端工程化与组件化开发实践"已经成为提升开发效率和代码质量的重要手段。本文将深入探讨这两个概念,并结合具体的实践案例,解析如何在JavaScript开发中应用它们。 首先,前端工程化是指通过...

    C#组件开发简易教程.

    通过学习这个C#组件开发简易教程,你将能够理解组件的基本概念,掌握组件开发的关键技术和实践,为构建高效、可维护的C#应用程序打下坚实基础。在实际开发过程中,不断实践和优化,将使你成为组件开发的专家。

    Vue项目组件化工程开发实践方案

    Vue项目组件化工程开发实践方案 本文将详细介绍Vue项目组件化工程开发实践方案,涵盖组件库、文档工程和例子工程三个方面。通过引入vde-cli脚手架,可以快速生成组件库工程目录结构,并且可以自动更新文档工程和...

    VC++编写COM组件教程

    **VC++ 编写COM组件教程** COM(Component Object Model)是微软提出的一...以上内容涵盖了创建和使用COM组件的基本知识,通过学习和实践,你可以熟练地利用VC++开发出高效的COM组件,并在不同的应用程序中灵活使用。

    delphi 组件开发 入门必看

    总之,Delphi组件开发是一个既有趣又实用的领域,掌握了组件开发技术,不仅能够提高编程效率,还能让你的程序具有更丰富的功能和更高的可扩展性。通过不断实践和学习,你将能够在Delphi的世界里游刃有余。

    asp组件开发指南

    ASP组件开发指南主要涵盖了几大核心知识点,这些知识点对于深入理解和构建高效、可复用的ASP应用程序至关重要。本文将详细阐述这些关键概念。...不断探索和实践,将有助于你在ASP组件开发领域积累深厚的专业技能。

    前端组件化开发实践 -1

    【前端组件化开发实践 -1】 前端开发领域中,组件化是一种重要的开发模式,它能够有效地管理和控制项目复杂性。随着技术的发展,组件化已成为现代前端框架的核心特性,如React和Vue等。美团点评技术团队在实践中也...

    QT生成COM组件并调用COM组件测试工程.7z

    QT生成COM组件并调用COM组件测试工程是一个涉及Qt框架与...通过这样的项目实践,开发者可以深入理解Qt与COM的集成,提高跨平台和跨语言组件开发的能力。同时,这也是对C++编程、对象接口设计和软件集成能力的一次锻炼。

    基于组件开发的组件选择过程

    基于组件开发(Component-Based Development,简称CBD)是一种现代软件工程方法论,其核心思想在于通过重用预先构建的软件组件来构建新的软件系统,以此提高软件开发效率,降低开发成本,提升软件质量。然而,CBD的...

    VC-COM.zip_ATL vs2010_ATL开发com组件_com开发 vs_vs com组件开发

    开发com组件_com开发 vs_vs com组件开发** 在软件开发中,组件(Component)是一种可重用的代码单元,它可以独立于应用程序而存在,并能被多个应用程序共享。COM(Component Object Model)是微软提出的一种组件...

    MapGis组件开发手册

    《MapGis组件开发手册》是一本专注于MapGis组件技术的权威指南,它深入浅出地阐述了组件开发的基本理论和实践技巧。MapGis作为一款强大的地理信息系统(GIS)软件,其组件化开发模式为用户提供了丰富的自定义功能和...

    COM组件的原理及应用

    这些资料对于深入理解COM组件的原理和实际应用有着极大的帮助,可以帮助读者从基础到实践,全面掌握COM组件的开发和使用技巧。 总之,COM组件是Windows编程中的重要组成部分,理解并熟练使用COM组件,可以提升...

    组件开发教程

    组件开发教程是一个面向初学者的指南,主要涵盖了COM(Component Object Model)技术的各个方面,旨在帮助读者理解并掌握COM组件的开发。COM是微软提出的一种软件组件标准,它允许不同程序之间共享代码和服务,实现...

    Delphi组件开发指南中文版

    《Delphi组件开发指南中文版》是一本专为Delphi开发者设计的详尽教程,旨在帮助读者深入理解和掌握在Delphi环境下进行组件开发的核心技术。Delphi是一款强大的面向对象的集成开发环境(IDE),以其高效的编译器和...

    iOS App组件化开发实践1

    在iOS应用开发中,组件化是一种重要的架构设计方法,它能有效地提高代码的复用性、可维护性和团队协作效率。本文将探讨iOS App组件化的实践,主要关注以下几个方面: 1. **组件化概念**:组件化是将一个大型的应用...

    com组件_vs2013

    总的来说,这个资源包是学习和实践COM组件、ATL和MFC的好材料,涵盖了从基础组件开发到高级应用的多个层面。通过这些项目,开发者可以深入理解COM的原理,掌握ATL和MFC的使用技巧,提升在Windows平台上构建组件和...

    visual C#基于组件的开发

    《Visual C#基于组件的开发》是一份深入探讨C#组件开发技术的宝贵资源,它涵盖了从基础到高级的各种主题,旨在帮助开发者更好地理解和实践组件编程。这份资料被分为三个部分,每个部分由一系列PDG文件组成,这些文件...

    创建一个简单的COM组件的资源

    - **选择开发工具**: Microsoft Visual Studio提供了方便的COM组件开发环境,如Visual C++或Visual Basic。 - **创建项目**: 新建一个ATL(Active Template Library)工程,ATL是微软提供的一套模板库,简化了COM...

    Linux平台上的组件开发技术.pdf

    在标签中,“Linux操作系统”、“系统开发”、“参考文献”和“专业指导”表明文章可能详细介绍了Linux系统下进行组件开发的相关技术和最佳实践,可能包括了具体的技术实现、开发工具以及可供开发者参考的技术对比。...

Global site tag (gtag.js) - Google Analytics