ATL ActiveX开发入门

简介:
ATL是什么呢? ATL,Active Template Library活动模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。通过活动模板库,可以建立COM组件,然后 通过ASP页面中的脚本对COM对象进行调用。这种COM组件可以包含属性页、对话框等等控件。

   ATL无疑是目前几种主流技术中最难学且相对边缘化的一门技术。随着Internet技术的发展,Microsoft将ActiveX技术作为其网络战略的一个重要组成部分大力推广,然而使用MFC开发的 ActiveX Control,代码冗余量大(所谓的“肥代码 Fat Code”),而且必须要依赖于MFC的运行时刻库才能正确地运行。虽然MFC的运行时刻库只有部分功能与COM有关,但是由于MFC的继承实现的本质,ActiveX Control必须背负运行时刻库这个沉重的包袱。如果采用静态连接MFC运行时刻库的方式,这将使ActiveX Control代码过于庞大,在网络上传输时将占据宝贵的网络带宽资源;如果采用动态连接MFC运行时刻库的方式,这将要求浏览器一方必须具备MFC的运行时刻库支持。总之MFC对COM技术的支持在网络应用的环境下也显得很不灵活。解决上述COM开发方法中的问题正是ATL的基本目标。 

   上面是对ATL简单介绍, 在我前几天博文定制IE浏览器的尖兵利器 - BHO 中提到怎么打造自己的浏览器, 对浏览器功能进行扩展. 源于最近有一项目, 客户想从一套国家级系统中提取数据, 我们不能够动那套系统任何一个功能, 那怕是加几个页面或者加个JavaScript函数. 但是我们确实需要那套系统能够提供一些必要的信息给当前用户想上马的系统, 因为这套系统是对国家局系统的补充完善, 整合了一些辅助功能进来, 是为稽查人员核查相关数据提供音视频相关佐证材料. 

  所以前期调研技术实现方面, 我想到了BHO + ActiveX技术, 经测试技术上确实可行, 用户通过点击我们在网页右键菜单中新增的相关菜单项, 由JavaScript来解析

当前页面数据, 然后调用ActiveX控件与中心服务程序进行Socket通信, 发送采集的信息到中心服务器. 如果你对ATL ActiveX控件开发不了解, 可以先看看VCKBASE

上的用ATL开发和部署ActiveX控件的简单例子这篇文章(使用Vs 2003开发), 其提供的例子非常简单, 只有一个GetString(BSTR bstr)方法. 想更加深入了解控件属性, 事件, 属性对话框编程, GDI绘制, 脚本引擎等开发方面内容, 可以看杨老师那篇用 ATL ActiveX 绘制任意平面函数的曲线. 开发控件过程还算比较顺利,

只是最终在编译Realease版本时候出现了一个LIBCMT.LIB(crt0.obj) : error LNK2001: unresolved external symbol _main错误. 也在网上找到了解决方法(

来自小飞百度空间文章) . 

   "最近写一个ATL的项目,最终realease的时候出现了这个问题,当时吓了一跳,后来发现了问题,代码没有错误是配置搞错了,因为debug没有任何问题。
出错原因:使用了CRT函数,这些函数需要CRT启动代码,就会出现这种链接错误。因为Release配置的Preprocessor definitions中定义了_ATL_MIN_CRT,它把将CRT启动代码从Dll中删除了。
最简单的办法就是工程设置中删除_ATL_MIN_CRT,但是这样以来就会增加编译后文件的大小。或者工程设置的ignore libraries中输入Libcmt.lib。再次链接时,到几个“unresolved external”的错误,然后你就开始Look for things that you think may be pulling in the startup code and remove them if you can.Instead, use their Win32 equivalents. For example, use lstrcmp() instead of strcmp(). Known functions that require CRT startup code are some of the string and floating point functions.
看了看微软的文档
ATL支持把一个服务器编连优化成最小尺寸或者依赖性最小。我们可以定义三个预处理器符号来影响服务器的优化。
_ATL_MIN_CRT             服务器不链接标准的C/C++运行库
_ATL_DLL                  服务器动态链接工具函数库atl.dll
_ATL_STATIC_REGISTRY    服务器静态链接对组件注册的支持

如果定义了预处理器符号_ATL_MIN_CRT,将不链接C/C++运行库,并且ATL提供了函数malloc、realloc、new和delete的一个实现。当定义了这个符号时,不能调用任何其他的C/C++运行库的函数。
ATL向导生成的ATL工程为所有的Release版本的编连定义了_ATL_MIN_CRT,但是没有为Debug版本定义这个符号。
Debug配置没有定义这三个符号中的任何一个。
RelMinSize配置定义了_ATL_MIN_CRT和_ATL_DLL。
RelMinDependency配置定义了_ATL_MIN_CRT和_ATL_STATIC_REGISTRY。
隐约记得,VC的sp6确实解决了这个bug,还是我比较懒,没有给vc打servicepack6。发现 打开stdafx.cpp,注释掉#include <atlimpl.cpp>也是可以的。
msdn描述
INFO:   LNK2001   Error   ATL   Release   Build   
ID:   Q165076     
     
     
     
--------------------------------------------------------------------------------   
The   information   in   this   article   applies   to:   
     
Microsoft   Active   Template   Library,   versions   2.0,   2.1,   3.0   
     
--------------------------------------------------------------------------------   
     
     
SUMMARY   
 Microsoft   Active   Template   Library   COM   AppWizard   generates   a   release   build   of   your   project   using   macro   _ATL_MIN_CRT.   Selecting   this   configuration   causes   the   C   run-time   (CRT)   library   startup   code   to   not   be   linked   into   your   project.   If   you   use   functions   or   code   in   your   project   that   require   the   use   of   the   C   run-time   library   startup   code,   you   may   experience   LNK2001   -   unresolved   external   errors   when   you   try   to   build   the   release   version   of   your   project.     
    
     
     
MORE   INFORMATION   
 You   can   use   some   C   run-time   functions   without   requiring   the   CRT   startup   code.   Examples   include   the   mem*   functions.   Other   functions   require   the   CRT   startup   code.   CRT   string   comparisons   for   example   require   the   startup   code   as   the   CRT   initializes   some   tables   used   for   comparing.   Global   objects   that   have   constructors   also   require   the   startup   code.   In   Visual   C++   5.0,   statically   linking   the   startup   code   adds   about   25K   to   your   image   (in   Visual   C++   4.2   it   is   about   20K).     
    
Following   are   some   suggestions   for   finding   the   cause   of   the   LNK2001   errors:     
     
 In   the   linker   options   there   is   an   "ignore   libraries"   edit   box.   Enter   Libcmt.lib   into   it,   and   build.   You   get   several   unresolved   externals.   This   list   is   everything   that   you   are   using   from   the   CRT.   Look   for   things   that   you   think   may   be   pulling   in   the   startup   code   and   remove   them   if   you   can.     
    
     
 Don't   ignore   Libcmt.lib,   but   turn   on   the   verbose   flag   for   the   linker.   From   this,   you   can   see   what   is   triggering   CRT   startup   code   to   get   pulled   in.     
    
     
 If   you   decide   that   you   really   need   the   startup   code,   then   remove   the   _ATL_MIN_CRT   define   from   the   project   settings.   You   can   also   dynamically   link   to   the   CRT,   which   reduces   your   image   size   but   requires   the   CRT's   DLL.   If   you   turn   on   exception   handling   you   have   to   pull   in   the   startup   code.   Even   when   building   minsize   the   default   is   to   statically   link   to   the   CRT   and   use   _ATL_MIN_CRT."


   最后值得一提是ActiveX当前最大问题是浏览器安全限制, 在一般情况下不太可能允许执行; 那就需要客户电脑对特定网址降低安全性, 当然最好处理方式是对控件

进行证书签名, 标识其为安全控件. 还好只要把右键菜单项的网址指向中心服务器上的相关页面, 那只要中心服务器注册这个控件的DLL就可以, 然后由它转发数据回访

问的客户端, 通知客户电脑上的视频监控客户端程序作出相应响应. 至于采用这种方式来解决, 主要是考虑到用户体验, 把所有功能都整合到其原先的B/S上, 交互操作

方便. 当然我们可以要求用户自己把页面上相关数据输入到我们系统提供的界面进行录像查询回放等相关操作, 但从用户使用方面, 操作性上来说不是太好.



本文转自peterzb博客园博客,原文链接:http://www.cnblogs.com/peterzb/archive/2009/08/07/1541044.html,如需转载请自行联系原作者。
目录
相关文章
|
程序员 API 开发工具
MFC应用程序开发教程1
MFC应用程序开发教程1
199 0
MFC应用程序开发教程1
Qt开发Activex笔记(二):Qt调用Qt开发的Activex控件
Qt开发Activex笔记(二):Qt调用Qt开发的Activex控件
Qt开发Activex笔记(二):Qt调用Qt开发的Activex控件
Qt开发Activex笔记(三):C#调用Qt开发的Activex控件
Qt开发Activex笔记(三):C#调用Qt开发的Activex控件
Qt开发Activex笔记(三):C#调用Qt开发的Activex控件
|
开发框架 前端开发 IDE
Win32编程点滴3 - 简单ActiveX控件的使用
虽然这里一片的.net气氛,到处充斥着像MVC、WPF、WorkFlow、LINQ等各种niubility的术语。但我们使用的Windows还是由COM技术主宰着;我们在选择日常使用的软件时,也会避免使用.net开发的软件。
1106 0
|
Web App开发 JavaScript 数据安全/隐私保护
用ATL开发和部署ActiveX网页控件
用ATL开发和部署ActiveX网页控件 摘 要 ActiveX插件技术广泛的运用于B/S系统中,本文通过一个项目实例,详细介绍用ATL开发和部署ActiveX网页控件的过程。学习使用ActiveX让浏览器访问客户端的硬件资源。
1873 0
|
Web App开发 JavaScript 测试技术
用ATL写简单的ActiveX控件 .
我正在做的项目需要用读卡器来读数据,由于系统是B/S架构的所以只能把读卡器的驱动封装成一个无界面的ActiveX控件,这样web页面中的js代码才能访问读卡器其实做起来也挺简单的,我用的环境是VS2005,步骤如下:打开VS2005后:1、创建一个ATL Project。
1077 0
|
前端开发 C# C++
闲聊桌面应用开发[Win16->Win32->ATL/WTL/MFC->WinForm->WPF/Silverlight/WinRT]
闲来无聊,正好小组人员讨论到桌面的开发,那把笔者接触的WIndows平台下的几个主要的发展过程聊一聊。 主要从概述,参考资料,图书等几个方面说起。 所有的界面开发都会涉及如下的几个方面的内容: v 控件 [Contrrols Widget]及验证 v 绑定:数据绑定到控件和控件的内容反馈回数据 v 布局系统: v 模式和支撑:和服务的通讯,MVC MVP MVVM等模式 史前期->WIN16 这个主要是Windows3.x的时代,这个时代笔者接触的不是很多,当年也主要是使用体验了。
1226 0
|
安全 C++ Windows
如何用ATL创建ActiveX控件
演示截图: 代码简介或代码解析:        如何用ATL创建ActiveX控件实现了一个ActiveX控件,它在一个圆内部有个正多边形,当用户在多变形内部单击将会使多边形的边数在当前的基础上+1,在多变形外部单击将会使多边形的边数在当前的基础上-1,并能改变多边形的颜色.最后举了两个例子说明了如何使用这个刚刚生产得控件.一个是把该控件应用到网页中,一个则是用于一个基于对话框的程序中.详细代码请下载压缩包.(一) 创建工程(1) 打开VC6集成开发环境,按新建按钮,选择PROJECT标签。
1098 0
|
存储 C++ 开发者
用ATL和MFC来创建ActiveX控件
摘要:目前MFC和ATL代表了两种框架,分别面向不同类型的基于Windows的开发。MFC代表了创建独立的Windows应用的一种简单、一致的方法;ATL提供了一种框架来实现创建COM客户机和服务器所必须的样板文件代码。
1699 0