ATL ActiveX开发入门
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上, 交互操作
方便. 当然我们可以要求用户自己把页面上相关数据输入到我们系统提供的界面进行录像查询回放等相关操作, 但从用户使用方面, 操作性上来说不是太好.
ATL ActiveX开发入门相关推荐
- 浏览器插件之ActiveX开发
浏览器插件之ActiveX开发(一) 一般的Web应用对于浏览器插件能不使用的建议尽量不使用,因为其涉及到安全问题以及影响用户安装(或自动下载注册安装)体验问题.在有特殊需求(如涉及数据安全的金融业务 ...
- JSP WEB开发入门基础到高手进阶教程002
JSP WEB开发入门基础到高手进阶教程 -------开发入门 JSP与微软的Active Server Pages 兼容,但它是使用类似HTML的卷标以及Java程序代码段而不是VBScript. ...
- Microsoft 智能手机(Smartphone)C#开发入门
Microsoft 智能手机(Smartphone)C#开发入门 原文地址:http://www.codeproject.com/KB/mobile/SmartphoneIntroCSharp.asp ...
- Xtreme Suite Pro使用教程:浏览器插件之ActiveX开发
浏览器插件之ActiveX开发(一) 一般的Web应用对于浏览器插件能不使用的建议尽量不使用,因为其涉及到安全问题以及影响用户安装(或自动下载注册安装)体验问题.在有特殊需求(如涉及数据安全的金融业务 ...
- ArcEngine C# GIS开发入门作业 (三)Ex04——实现地图的简单渲染和唯一值渲染
文章评论 写评论 sinat_37432938: 可以说非常有参考的意义,谢谢分享 4周前 #2楼 举报回复查看回复(1) domen_dragon 回复 sinat_37432938: 哈哈,谢谢夸 ...
- Hololens Unity 开发入门 之 Hello HoloLens
Hololens Unity 开发入门 之 Hello HoloLens~ 本文主要记录 HoloLens Unity 开发入门 ~ 一.说在前面的话 Unity 对 VR AR 甚至 将来的 MR ...
- 【Arduino】开发入门教程【一】什么是Arduino
Arduino Arduino 是一款便捷灵活.方便上手的开源电子原型平台,包含硬件(各种型号的arduino板)和软件(arduino IDE).它适用于艺术家.设计师.爱好者和对于"互动 ...
- unity开发入门_Unity游戏开发终极入门指南
unity开发入门 Unity is a great tool for prototyping everything from games, to interactive visualisations ...
- 《iOS 8应用开发入门经典(第6版)》——第1章,第1.6节小结
本节书摘来自异步社区<iOS 8应用开发入门经典(第6版)>一书中的第1章,第1.6节小结,作者 [美]John Ray(约翰 雷),更多章节内容可以访问云栖社区"异步社区&qu ...
- openresty 前端开发入门五之Mysql篇
2019独角兽企业重金招聘Python工程师标准>>> openresty 前端开发入门五之Mysql篇 这章主要演示怎么通过lua连接mysql,并根据用户输入的name从mysq ...
最新文章
- c语言char转wchar t,c语言char和wchar_t 转换
- Oracle 聚合函数(Aggregate Functions)说明
- ORACLE 中极易混淆的几个 NAME 的分析和总结
- [转]如何讓IE7中關閉瀏覽器不出現詢問
- java keytool 导入证书_java - Keytool无法导入证书 - SO中文参考 - www.soinside.com
- php require 找不到,php使用require()时的注意点
- mysql暂停触发器_mysql如何临时禁用触发器
- DataV:可视化大屏展示神器实战分享
- tail将输出的日志放到文件中_如何将Spring Boot应用中日志输出格式改为JSON?
- Python迭代列表
- [nsis]安装包界面乱码问题
- c语言中如何确保一个程序是单例的_浅谈设计模式——单例模式
- 流形学习t-SNE,LLE,Isomap
- 大数据导论答案_《数据科学与大数据通识导论》题库及答案
- Cisco.Packet.Tracer思科模拟器浮动路由讲解(含实例步骤)
- mysqldb python linux,Linux下安装 MySQLdb模块
- Python 机器学习 唐宇迪泰坦尼克号【最新代码】
- 备战腾讯面试经历分享,小伙终获Android岗Offer
- 腾讯优图贾佳亚:当AI进入产业应用时代时,计算机视觉技术更应该服务于人才对!...
- QT5简易音乐播放器的设计