因工作需要,需要开发一个海康威视的视频ocx控件,嵌入到intouch,组态王一类的组态软件中使用。

之前从没做过ocx控件的开发,连MFC的开发也没做过,折腾了几天,终于基本完成。记录一下这个过程。

第一部分 ocx控件的创建

首先在网上查找了一下资料,按照下面这篇文章,创建了一个ocx控件。

http://blog.csdn.net/longhuahaha/article/details/8556964

为了防止自己忘了这个过程,现把这个文章完整的贴过来

1.ActiveX的基本概念

ActiveX控件可以看作是一个极小的服务器应用程序,它不能独立运行,必须嵌入到某个容器程序中,与该容器一起运行。这个容器包括WEB网页,应用程序窗体等。。。

ActiveX控件的后缀名是OCX或者DLL。一般是以OCX和动态库共存的形式打包成cab或者exe的文件放在服务器上,客户端下载后运行安装cab或exe解压成OCX和动态库共存的文件,然后注册ocx文件。

ActiveX控件是基于com标准,使得软件部件在网络环境中进行交互的技术集。它与具体的编程语言无关。作为针对Internet应用开发的技术,ActiveX被广泛应用于WEB服务器以及客户端的各个方面。同时,ActiveX技术也被用于方便地创建普通的桌面应用程序,此外ActiveX一般具有界面。

2.三个概念:ActiveX、OLE和COM

从时间的角度讲,OLE是最早出现的,然后是COM和 ActiveX;从体系结构角度讲,OLE和ActiveX是建立在COM之上的,所以COM是基础;单从名称角度讲,OLE、ActiveX是两个商标名称,而COM则是一个纯技术名词,这也是大家更多的听说ActiveX和OLE的原因。COM是应OLE的需求而诞生的,所以虽然COM是OLE的基础,但OLE的产生却在COM之前。COM的基本出发点是,让某个软件通过一个通用的机构为另一个软件提供服务。ActiveX最核心的技术还是COM。ActiveX和OLE的最大不同在于,OLE针对的是桌面上应用软件和文件之间的集成,而 ActiveX则以提供进一步的网络应用与用户交互为主。COM对象可以用C++、Java和VB等任意一种语言编写,并可以用DLL或作为不同过程工作的执行文件的形式来实现。使用COM对象的浏览器,无需关心对象是用什么语言写的,也无须关心它是以DLL还是以另外的过程来执行的。从浏览器端看,无任何区别。这样一个通用的处理技巧非常有用。

3.ActiveX控件工程的创建

使用VS2010有两种方式可以创建ActiveX工程,

第一种:创建“MFC ActiveX 控件”工程;

第二种:创建“ATL 项目”。由于使用ATL开发ActiveX控件需要了解com技术,对程序员的要求也较高,开发时间也较长,所以如果ActiveX只在windows操作系统下运行,那么就使用“MFC ActiveX 控件”工程来快速建立ActiveX控件。但是这里要注意了:使用“MFC ActiveX 控件”工程来快速建立ActiveX控件,他不仅要建立在windows操作系统下,还必须在windows操作系统下安装c++依赖库安装包,因为MFC是建立在微软的c++动态库的基础上的。所以这两种方式各有优缺点,根据项目需求来选择适合的方式。

4.使用VS2010创建MFC ActiveX工程项目步骤

由于使用ATL进行ActiveX工程的创建难度比较大,所以这里先使用“MFC ActiveX 控件”工程来创建一个简单的ActiveX控件。

第一:新建项目-》选择“MFC ActiveX 控件”工程,给项目命名TestMfcAtlDebug,点击确定,弹出“控件向导”对话框

第二:在概述,应用程序设置,控件名称和控件设置都可以选择默认,然后点击“完成”,这样“MFC ActiveX 控件”工程创建完成

5.分析“MFC ActiveX 控件”工程的三个重要的类以及对外接口定义文件idl

使用向导创建完工程可以看到自动生成了三个类,TestMfcAtlDebug,TestMfcAtlDebugCtrl和TestMfcAtlDebugPropPage

可以打开上面三个类的头文件及cpp文件,发现它们都是派生类。

TestMfcAtlDebug:cpp文件中定义了DllRegisterServer和DllUnregisterServer,可以发现ActiveX的注册和反组册都与该类有关。

TestMfcAtlDebugCtrl:可以发现该头文件中声明了消息映射(让ActiveX控件程序可以接受系统发送的事件通知,如窗体创建和关闭事件),调度映射(让外部调用程序(包含ActiveX的容器)可以方便地访问ActiveX控件的属性和方法),事件映射(让ActiveX控件可以向外部调用程序(包含ActiveX的容器)发送事件通知)。也就是说对ActiveX控件的窗口操作都将在这个类中完成,包括ActiveX控件的创建,重绘,以及在此类中创建可视MFC窗体。

TestMfcAtlDebugPropPage:显示ActiveX控件的属性页的

让我们来看看最重要的部分:对外接口定义文件TestMfcAtlDebug.idl,代码如下:

[cpp] view plaincopy print?
  1. #include <olectl.h>
  2. #include <idispids.h>
  3. [ uuid(69EE37F4-8B36-495F-9F60-5E3AAF2FB494), version(1.0),
  4. control ]
  5. library TestMfcAtlDebugLib
  6. {
  7. importlib(STDOLE_TLB);
  8. //  CTestMfcAtlDebugCtrl 的主调度接口
  9. [
  10. uuid(6B60346D-5CCD-4907-83F4-51938558A9B7)
  11. ]
  12. dispinterface _DTestMfcAtlDebug
  13. {
  14. properties:
  15. methods:
  16. [id(DISPID_ABOUTBOX)] void AboutBox();
  17. };
  18. //  CTestMfcAtlDebugCtrl 的事件调度接口
  19. [
  20. uuid(E26ECC46-9BA2-4C25-A4DD-A690560A5113)
  21. ]
  22. dispinterface _DTestMfcAtlDebugEvents
  23. {
  24. properties:
  25. //  事件接口没有任何属性
  26. methods:
  27. };
  28. //  CTestMfcAtlDebugCtrl 的类信息
  29. [
  30. uuid(DD0CF7EF-A181-428C-B5FC-C44A1C13CA43)
  31. ]
  32. coclass TestMfcAtlDebug
  33. {
  34. [default] dispinterface _DTestMfcAtlDebug;
  35. [default, source] dispinterface _DTestMfcAtlDebugEvents;
  36. };
  37. };

这个就是对外接口定义文件,如果外部程序想要调用ActiveX的方法,属性以及在注册表注册的classid(WEB网页调用需要使用),就必须了解这个文件,这个文件可以分为四个部分来看:

首先是TestMfcAtlDebug.Lib这个库信息

这个就不做详解

第二部分是调度映射的接口信息,该接口信息包含了属性(如控件背景色)和对外方法

里面定义了一个方法AboutBox(),该方法就可以被外部程序调用,在该接口里定义的函数都是纯虚函数,这些函数的实现都是在TestMfcAtlDebugCtrl中完成的,MFC通过底层的封装,让TestMfcAtlDebugCtrl类继承这个接口,实现函数。

第三部分是事件映射的接口信息

第四部分是类的信息,其中uuid就是ActiveX控件注册到注册表的classid,它是ActiveX注册后在系统内的唯一标识,WEB网页就是使用这个ID加载ActiveX控件的

6.定义调度映射和事件映射方法,提供给外部调用者使用
那么怎么定义新的调度映射和事件映射方法呢,如果手动定义很不方便,当然使用编译器进行定义,步骤是打开类视图:

可以看到TestMfcAtlDebugLib中有_DTestMfcAtlDebug和_DTestMfcAtlDebugEvents,在_DTestMfcAtlDebug项中可以右键-》添加方法(或属性),该操作是完成调度映射的方法和属性的添加;在_DTestMfcAtlDebugEvents项中可以右键-》添加方法(或属性),该操作是完成事件映射的方法和属性的添加。

举个例子,如果要添加一个调度映射的方法Fuck2(),使得外部可以调用:

在_DTestMfcAtlDebug项中可以右键-》添加方法,设置框

填写完信息后点击完成,外部就可以调用方法Fuck2,同时ActiveX控件项目代码的内部将会在三个文件中新增代码:

1.在

2.在

3.在

7.注册ActiveX控件

按照上面的步骤已经完成简单ActiveX控件(无窗体界面的控件)的编写,重新生成后会在Debug下生成一个TestMfcAtlDebug.ocx的文件,使用windows的dos窗口可以注册这个ActiveX控件

步骤:

首先win+R键打开运行,然后输入注册命令:regsvr32  c:\.......\TestMfcAtlDebug.ocx(反注册命令:regsvr32  c:\.......\TestMfcAtlDebug.ocx -u)

有两种情况会导致控件注册失败:

第一种:使用非Administrator用户登入系统会由于权限不足而无法注册com组件,这时候就必须使用Administrator用户登入操作系统

第二种:ActiveX控件所依赖的dll库被程序给占用,就会导致注册失败,解决办法是将正在运行的程序关闭就可以

 8.测试ActiveX控件的方法

按照上面的步骤已经完成ActiveX控件的编写,也将这个控件注册成功了,那么怎么测试这个控件呢,有三种方式:

第一种:使用html网页来测试

在TestMfcActiveX.htm的文件中编写代码如下:

[html] view plaincopy print?
  1. <HTML>
  2. <HEAD>
  3. <TITLE>Test ActiveX</TITLE>
  4. </HEAD>
  5. <OBJECT ID="TestMfcAtl Control" WIDTH=528 HEIGHT=545 classid="CLSID:DD0CF7EF-A181-428C-B5FC-C44A1C13CA43">
  6. <PARAM NAME="_Version" VALUE="65536">
  7. <PARAM NAME="_ExtentX" VALUE="12806">
  8. <PARAM NAME="_ExtentY" VALUE="1747">
  9. <PARAM NAME="_StockProps" VALUE="0">
  10. </OBJECT>
  11. </HTML>

注意上面的classid就是在idl文件中类的uuid,然后打开这个网页就会显示ActiveX控件。上面的classid在控件成功注册后也可以通过注册表查找,具体方法是win+R键,输入regedit命令,就会弹出“注册表编辑器”,位置在“HKET_CLASSES_ROOT”中,根据你控件的名称,快速按下前三个字母,然后就可以定位到比较好找的位置,如下图

第二种:建立Mfc应用程序,在Mfc窗口右键-》插入“ActiveX”控件,然后就会在MFC的窗体上显示ActiveX控件

第三种:也是最方便的一种方法,就是使用vs自带的ActiveX Control Test Container来测试ActiveX控件,但是VS2010在“工具”中没有这一项,那么我们首先可以手动把这个工具添加到VS2010里,首先找到C:\Program Files\Microsoft Visual Studio 10.0\Samples\2052\C++\MFC\ole\TstCon\TstCon.sln,然后使用VS2010打开解决方案TstCon.sln,编译项目TCProps和TstCon,编译完成后会在C:\Program Files\Microsoft Visual Studio 10.0\Samples\2052\C++\MFC\ole\TstCon\Debug\中生成TstCon.exe执行程序,这个执行程序就是ActiveX Control Test Container,接下来我们就在VS2010中的工具中添加这个TstCon.exe,在VS2010中的“工具”菜单项中选择“外部工具”,在弹出的窗体中添加一个新的工具,标题为ActiveX Control Test Container,命令为C:\Program Files\Microsoft Visual Studio 10.0\Samples\2052\C++\MFC\ole\TstCon\Debug\TstCon.exe,然后点击确定就可以完成工具的添加了。

这样,在“工具”中就有了一个ActiveX Control Test Container,点击它就会弹出测试ActiveX的容器,如下图

点击Edit->Insert New Control->选择TestMfcAtlDebug Control,点击OK

然后就会显示这个注册后的AcitveX控件,如果要测试这个控件的调度映射的方法Fuck2,就先选中控件,然后点击Control-》Invoke Methods,在Methods Name下拉框中选择Fuck2这个方法,点击Invoke按钮就可以测试这个方法了,如下图:

我们可以看到上面的ActiveX控件是一个空白的背景和一个圈组成的,并没有窗体界面,那么怎么添加窗体呢?

9.向ActiveX控件中添加一个Mfc窗体,就是一个带界面的ActiveX控件

步骤:

第一:在资源视图中新建一个对话框资源

去掉上边的“确定”和“取消”按钮,然后修改对话框属性:Border改为None,Control改为Ture,ID改为IDD_MAIN_DIALOG,Style改为Child,System改为False,Visible改为True,然后在对话框中双击,为对话框添加一个类,如下图:

点击“完成”。在解决方案资源管理器中新增了一个ViewDialog.h和ViewDialog.cpp这个ViewDialog类就是刚刚我们建立的对话框类

然后拖一个Edit Control到对话框上,修改其ID为IDC_EDIT_OUTPUT,再拖一个Button到对话框上,此时对话框效果为:

对话框建立完成,接下来就是要把它添加到ActiveX控件中去

第二:在TestMfcAtlDebugCtrl.h中定义对话框实例m_VideoDlg

然后在TestMfcAtlDebugCtrl类中定义两个消息映射:窗体创建完成消息映射和窗体改变大小消息映射

在VS2010的菜单项“项目”--》“类向导”中,选择要添加到的项目和类中,选择“消息”选项卡,选择WM_CREATE后点击”添加处理程序“按钮和选择WM_SIZE

后点击”添加处理程序“,这样在“现有的处理程序”中就有OnCreate和OnSize这两个函数,点击确定,完成消息映射函数的添加,如图:

在TestMfcAtlDebugCtrl.cpp中自动添加下列代码,如图:

在OnCreate函数中编写如下代码(Create是在ActiveX控件中创建一个窗体对话框,IDD_VIEW_DIALOG就是刚刚新建的对话框):

在OnSize函数编写代码如下(MoveWindow是确定窗体对话框在ActiveX中的大小):

第三:重新编译,注册ocx,使用ActiveX Control Test Container再次测试该控件

创建过程中遇到的问题总结:

1.创建完成后编译时报错 error C1189: #error :  Please use the /MD switch for _AFXDLL builds,解决办法:右键项目,【属性】-->【配置属性】

-->【C/C++】-->【代码生成】-->【运行库】,选择如下选项:

2.按照上述文章创建完成后控件始终显示不出来,经检查,发现文章有一处代码漏掉了,在onDraw函数里需要加入如下代码

void CHikControlCtrl::OnDraw(
CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{
if (!pdc)
return;
// TODO: 用您自己的绘图代码替换下面的代码。
//pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
//pdc->Ellipse(rcBounds);

m_ViewDialog.MoveWindow(rcBounds);
}

第二部分 海康威视ocx控件开发

首先在海康威视的官方网站下载SDK

http://www.hikvision.com/cn/download_61.html

解压缩后,将头文件和库文件都添加到工程中

右键-->【添加】-->【现有项】-->加入所需头文件

右键-->【属性】-->【配置属性】-->【C/C++】-->【常规】

在【附加包含的目录】里加入头文件所在目录

右键-->【属性】-->【配置属性】-->【链接器】-->【常规】

在【附加库目录】加入sdk库目录

右键-->【属性】-->【配置属性】-->【链接器】-->【输入】

在【附加依赖库】里加入

HCNetSDK.lib
ws2_32.lib

设计的控件界面如下:

在海康威视的sdk中有好几个例子,借助这些例子可以很容易完整相关的功能。

出过的问题:

1.做这个控件过程整个感受就是,类的添加也好,各种消息事件的添加均通过右键-->【类向导】来完成比较好,一开始自己手动添加出了各种各样的麻烦。

2.右键-->【属性】-->【配置属性】-->【常规】里,字符集最好调整成【使用多字节字符集】,不然调用sdk的函数时字符处理很麻烦。

3.调用messagebox时出现参数不匹配的情况,经过搜索大致知道有messageboxA,messageboxW两种情况,由于没有做过MFC的开发,不是很清楚细节原因。

海康威视视频ocx控件开发总结相关推荐

  1. OCX控件开发及WEB Javascript如何使用OCX控件

    一.OCX控件开发 1.使用IDE版本: VS2010 2..基于MFC技术 开发OCX控件. 3..基本OCX开发过程 3.1.打开VS 2010 新建项目,选择MFC模板,"MFC    ...

  2. MFC .ocx控件开发

    本文将介绍ocx的含义,以及如何利用MFC创建ocx控件. 1.ocx控件的含义 OCX 是对象类别扩充组件(Object Linking and Embedding (OLE) Control Ex ...

  3. TSINGSEE青犀视频H265编码视频流媒体播放器EasyPlayer-RTSP的OCX控件注册过程介绍

    很多用户了解到TSINGSEE青犀视频团队大多是因为各种不同协议且可靠稳定的视频平台,其实在视频方案上面,我们除了视频平台,还自主研发了视频播放器项目EasyPlayer.EasyPlayer-RTS ...

  4. VC2005从开发MFC ActiveX ocx控件到发布到.net网站的全部过程

    VC2005从开发MFC ActiveX ocx控件到发布到.net网站的全部过程 开篇语:最近在弄ocx控件发布到asp.net网站上使用,就是用户在使用过程中,自动下载安装ocx控件.(此文章也是 ...

  5. [转]C#开发ActiveX控件,.NET开发OCX控件案例

    引自:百度   http://hi.baidu.com/yanzuoguang/blog/item/fe11974edf52873aaec3ab42.html 讲下什么是ActiveX控件,到底有什么 ...

  6. DELPHI 开发的 OCX 控件在 MFC 程序中编辑框快捷键不好使的解决

    公司一个大型的项目中使用了 DELPHI 来开发 OCX 控件做数据库的管理,但是GIS图形系统使用 MFC 开发,最后将 OCX 嵌入到 MFC 程序中作为一个完整的系统交付用户使用,但是在使用过程 ...

  7. MFC中开发ocx控件,html容器收不到ocx的事件Event

    问题背景: MFC开发ocx控件,主窗口就是ctrl类,主窗口类中调度接口和事件映射添加,执行OK,外部html容器中接收事件成功,如下: ctrl.h中声明事件映射函数 void EVTPENSIG ...

  8. 实现谷歌浏览器打开海康视频等OCX控件

    1.下载工具并安装 控件工具安装程序下载: 链接:https://pan.baidu.com/s/1HKc0gM7W5DFMbeMSYLM0sg 提取码:dnmn 2.打开安装目录下的openIE.h ...

  9. Visual Studio开发MFC项目OCX控件添加使用控件方法

    1.在Windows系统中注册OCX控件 在OCX控件目录,右键新建一个文本文档,将文件名和扩展名改为"双击注册.bat",添加如下注册脚本: cd /d %~dp0 RegSvr ...

最新文章

  1. 年后准备跳槽可以看看
  2. Linux系统Git环境配置
  3. iPhone Three20软件引擎之构建开发环境与HelloWorld
  4. 【完结】AutoML如何应用于模型优化,这些文章可以作为一个参考
  5. 音视频技术开发周刊 | 215
  6. 如何让IOS中的文本实现3D效果
  7. dns 服务器 linux_在Linux上构建自己的DNS服务器
  8. python与线性代数 解线性方程组
  9. java 读取 jar properties_java:如何读取properties文件内容
  10. python点图为什么显示不出来_matplotlib图只显示点而不是lin
  11. python如何更改背景颜色_python背景颜色,python改背景色
  12. 十年后是计算机人员的作文,二十年后的电子计算机作文
  13. 记录一次在线网页加密PDF解密过程
  14. Obsidian media extended以及bilibili插件链接总是打开外部网页以及退回编辑视图会弹出另外一个相同文件
  15. 获取所有复选框选中状态的id
  16. 使用计算机的成本包括哪些,课题经费预算其他费用包括哪些
  17. 如何升级nodejs版本
  18. 知物由学 | 舆情数据清洗“动”“静”分离方案
  19. 计算机开机选择用户界面,win7系统每次开机都会出现选择操作系统界面的设置办法...
  20. DB2快速入门—DB2 11的安装与使用

热门文章

  1. Eterm协议中文汉字编码
  2. javamail写邮件/邮箱验证报错javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection
  3. HDLM命令dlnkmgr详解之三__view
  4. 设置U盘盘符为自定义图片
  5. java经典递归 背包问题
  6. HTML+CSS+Javascript简易记账本(localStorage)
  7. 计算机网络知识点——4.介质访问控制子层
  8. linux网卡驱动rtl8188cu,linux下编译基于rtl8188cu控制芯片的USB无线网卡驱动 -电脑资料...
  9. 深圳大学计算机与软件学院2018分数线,深圳大学录取分数线2021是多少分(附历年录取分数线)...
  10. 记一次在android使用fdisk