• 截屏上传插件开发流程


    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

  • 相关阅读:
    Windows Live Writer Testing
    基于本地文件系统的LocalDB
    【笔记】动画显示窗体
    winform无边框窗口拖动
    关于js的内存机制
    flex-basis
    Cookie、session和localStorage、以及sessionStorage之间的区别
    关于报文
    关于http与https Tcp的三次握手四次握手
    关于前后端分离与不分离
  • 原文地址:https://www.cnblogs.com/wonderfuly/p/CaptureUpload.html
Copyright © 2020-2023  润新知