截屏上传插件开发流程

ActiveX简介

  ActiveX作为一种古老的技术曾经辉煌一时,因其安全性一直被人们所诟病,现在很多功能已被其它技术

   (Silverlight、Flash、html5)所取代。为什么ActiveX不安全呢?因为安装后它可以操作本地电脑资源,

  这就人们又爱又怕的地方,爱的是开发人员,利用它可以做很多事,很多事Web或其它技术不能做的事情,

  比如:自动读电脑的目录并上传资料,修改电脑的一些设置等。使用者怕它会不会在自己的电脑里面做一

  些坏事,比如:窃取用户电脑资料、种植木马等等。

  虽然ActiveX渐渐的在退出历史的舞台,IE对它的限制也越来越严格,但是现下还有很多地方在使用这一项技术。

  比如网上银行和一些登录安全安求比较高的网站密码框(如:淘宝)用的就是它了,文件上传,网站需验证用户

  电脑IP,MAC地址,网上视频,监控等等。

截屏并上传插件开发

开发原因

  从事MIS系统开发多年,在维护系统的时候,经常有一些新来的同事在使用系统时,出现一些问题。

  于是老打电话给IT的系统护人员资询,说系统出错了。系统护人员就问出现什么错误,用户有时又描述不清,

  于是要求用户截个屏看看是什么情况,或者干脆走到用户里去。有时候新人连截屏都不知道,还有怎么发给你

  看等一系列问题,IT系统护人员你是不是也经常遇到这样的问题,是不是被这样的事烦透了呀。所以一直想开

  发一个能自动截屏并上传的功能,Web不能操作客户端所以没法截屏,只能用其它技术,于是便有了开一个

  ActiveX控件截屏并上传到指定页面的想法。

技术选择

  自己大学入门的第一门语言便是C语,印象非常深刻,也学了一期VC好像没学到什么东西,之后就老师引入了

  VB.NET这门课,VS2002新建窗体拖控件,太强太神奇了,后来出来工作公司用的是VS2003用的是C#,自己

  也自然而然改投C#门下,一直至今。开发ActiveX控件有很多个方法,可以用VB、Delphi、C、C++等等,

  C#也能开发前提是使用ActiveX控件的客户端得装一个.NET框架,这点让人受不了。于是决定采用C++开发。

学习历程

  寻觅ATL开发教程。《Visual.C.6.0Active.XNathan.Wallance.pdf》这本教材作为入库级的教材相当不错,

  《ATL开发指南.pdf》这本稍深入一点。 了解一下COM,确实是一个复杂的技术,不是专业人士是很难开发的,

  我只是开一个截屏上传的功能,所以其它不相关的只是了解,也没精力深入学习冲冲越过。

  用C++开发ActiveX可采用MFC\ATL两种方式。MFC类库全开发方便快捷,但是控件体积相对来讲要大一点,

  而ATL正是为开发ActiveX而生,控件体积小,类库当然没有MFC的全了,所以很多东西得自己实现,VC5.0\6.0

  之后引用了向导开发工作简化了很多,新手也更容易入门,开发一些简单的控件应该也不再是一件很困难的事情了。

  也看了很多人写的博客教程,开始平台用的是VC6.0因为与本机总是不兼容而告吹,其实VS20XX中的Visual C++

  也是可以开发的。

功能分析

  1)截取客户端屏幕,这个不需要用户截取指定区域,直接抓取用户的整个屏幕即可,

     所以控件不需要界面。

  2)上传到指定的网页,所以得有网络传输的功能。

技术实现

  原则:尽量用最底层的类库,最好是系统自带的这样控件体积就越小安装越方便,无需引入其它dll或框架之类的。

  一、屏幕截取

  1)获取屏幕,可以通个窗口句柄,获取屏幕,也可以CreateDC创建 HDC对象等。

      2)保存操作,遇到了一个艰难的选择,一是自写实现保存为位图,如果想保存其它格式(jpg)那得写一堆代码。

          二是引入高级一点的类库,atlimage.h头文件里面有CImage这个类,一个Save指定一下格式就可以搞定。

  二、图片上传

  1)网络通讯功能最底层当然是socket了,http post 上传文件,这个得先熟悉一下http的协议,因为一直从事WEB开发,

    对个已经相当熟知了,于是用Firefox浏览器中用HttpFox抓取了上传的POST文本,按照这个拼装。socket怎么使用,

      网上搜索一番,整理一下,然后按照这个开始发数据到测试上传网页,一直不成功。拼装的字符串看了一遍又一遍,

      与协议反复核对,换行是否正确分隔线是否正确,其实在这里我范一个错,我把头部boundary的分隔线直接复制到后面

      文件分隔用了,结束后要多加--这个当然知道了,于是上网搜一个http抓包的工具 sniffer专业版,安装调式程序居然没抓

      到包,专业版太专业了不好用,也可以是自己没用习惯吧,又换一款Fiddler抓包工具,测试了一几个网址,Fiddler果然

      不错简洁不少。令人失望的是也没抓到包,开始怀念以前sniffer的一个简易版了,不管是什么数据,只要是有通讯都能抓。

      终于到了一款MiniSniffer虽然跟以前的那一款不同,但同样可以抓通讯数据, 这下终于能监控到发送的数据了,核对发送

      的数据也没错呀,悲摧了。经过几天的拆腾,放弃用socket了,继续搜寻看看C++下http通讯的有那些类,MFC下有

      CInternetSession等系列类,C++稍高层的有HINTERNET系列,ATL7.0以上提供了CAtlHttpClient类,经过筛选比

      较之后锁定用HINTERNET来开发,网上看例子看API学习,真的是被C++的类型打败了,又花了一点时学习这些类型及

      关系,不得不感叹c++的复杂与强大,原来C#的泛型在C++下早就有了,我相信应该还有很多功能其很早就有了,只是

      现在变得很加好用了,同为VS IDE下的产品与C#的编程环境就差别那么大呢? Visual C++没有提示,不会智能补全,

      删除大括不对齐,太多不方便了。又到了激动人心的时该了,调试又是不成功,这次又启用Fiddler可以监控到,也看到了

      发送的数据,核对核对。折腾了几天,到网上搜了几个例子,原原本本的的复制下来,其它也没有几个可行的,几经努力找

    到一个可行了,写法都差不多呀,后来无意中,我把头部的boundary的分线复制下与文件的分线进行对比发现了一个,令人

    兴奋的差异就是文件、控件表单名分隔多了两个--,修改后哇成功了。回头把socket做的方案修改了一下也成功了。最后就是

     接收返回的信息,需要把char字符转换成UTF-8就行了,socket收接信息包含了http信息,需要把头截取返回信息体即可,

     c/c++毕竟不是很熟识,操作也没高级语言方便所最的采用了HINTERNET的实现,图片保存也用CImage这个类,

       最终功能完成。

      小结:自已对http协议看得不是太仔细,一个细小的错误,导致花费具多的时间,不过也学到了很多东西。

           还有就是越高级的类越好用。

功能测试

    1、正常测试

    网页一加载调用,截屏上传OK一切正常。

        2、压力测试

            去掉提示按住F5不放(其实可在js里面写个循环的),一张张截屏不断的出现在upload文件夹里面,不错,

    打开Windows任务管理器,CPU时高时低正常,内存不断在增加,关闭IE内存恢正常,不这个太满意。

    3、异常测试

     1)传入错的url,返回找不资源正常返回,再刷新出错IE崩了。

     2)网络断开,报错正常返回异常,再刷新出错IE崩了。

     3)网站停掉,报错正常返回异常,再刷新出错IE崩了。

   小结:内存增加关键资源未释放、或对c/c++的char/char[]/指针等的错误使用,IE崩溃发现在异常抛出,提示堆栈异常,

      有个BSTR*的返回类型,对BSTR类型赋值错误操作所致。错误用法 *pVal=L"有异常";正确用法使用:

      :SysAllocString赋值。前前后后修改与优化再测试用了几天最后一切正常了。

系统发布

          ActiveX有这么几种后缀dll、exe、ocx等,为了便于用户安装或网络传输,一般需要打包成cab压缩包,最后就是签名。

    1、 编写inf文件。

    2、 cab制作方法

     1)可以使用VS新建一个cab新项目添加需要的dll和你的activex的dll、exe、ocx文件,查看依赖项可以在VS命令提示行

       输入dumpbin /dependents 你的dll这个命令。

     2)Cabarc 这个工具,具体可参照微软的官方网站做法 。

               3)IExpress这个命令也可以制作,会弹出向导指导你一步步往下做。

    3、签名

               1)制作证书makecert.exe.

               2)证书转换cert2spc.exe.

               3) 签名signtool.exe.

                这几个可以在vs命令提示行直接输入接对应的参数即可。

系统测试

    部署测试环境,在IIS中新网站或在默认站点下新建一个应用程序,编写一个文件上传的ashx或aspx文件,

    把测试页和cab包放在同一目录下,其它web编程语言与可以。在浏览器中查看测试页,因浏览器安全性较高,没有提示或

        没有安装提示,请把浏览的地址加入到可信站点,然后设置对下载未签名的ActiveX控件点提示,运行点启用。第一次会有

        提示安装,然后就可以在网站upload里看到截图了。如果按照上述步骤安装不成功,一般是引入的dll在安装的时候注册不成

        所致,本插件有依赖atl80.dll、msvcr80.dll一般系统都有带所以没有打包进来了,不知道win2000/xp是否有带没有进行

        测试。

系统推广

        1、公司业务人员推销。

        2、发送给老客户试用。

        4、各大搜索引擎推广,知名网站打广告。

        5、各大论坛、博客、软件下载网站发贴推广。

        6、技术贴推广。

   

 本插件定义为共享插件。      

 最后奉上开发的这个插件点击下载

 第一次认认真真的写博客,写博客确实是一件很费时间的事情。

 联系方式邮箱:lenggaitian2002@163.com

原文地址:https://www.cnblogs.com/wonderfuly/p/CaptureUpload.html