背景

最近需要做web实时播放摄像头视频的管理网站,而设备提供的接口则是需要提供控件句柄,java语言获取控件句柄不太会,只好考虑利用C#将控件做成activeX嵌入网页中。

开发步骤

1.利用vs2010创建一个windows窗体控件库,命名为VideoPlay;

2.在窗体控件中添加一个pictureBox控件及两个按钮;

3.在AssemblyInfo.cs中引用System.Security命名空间,并添加一句:[assembly : AllowPartiallyTrustedCallers()]

4.创建GUID

ActiveX控件首先是COM组件,COM组件有唯一的GUID。后面我们可以看到,在Web中,需要通过GUID定位并加载已经注册的ActiveX控件。

如果使用的是VS2010,工具菜单下有个“创建GUID”菜单,点击它可以创建一个新的GUID,然后把其复制作为CameraVideoPlayer的特性:

[Guid("2A80B21A-9E7C-40B3-88DA-CF98A6A34B3D")]public partial class VideoPlay: UserControl

5. 实现IObjectSafety接口

当ActiveX控件在浏览器中调用的时候,往往会出现警告框,提示不安全的控件正在运行。这是由浏览器安全策略所限定的,控件通过实现IObjectSafety接口以向浏览器表明自己是合法的。在项目中增加IObjectSafety接口的定义:

[Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IObjectSafety
    {       
        void GetInterfacceSafyOptions(System.Int32 riid,out System.Int32 pdwSupportedOptions,out System.Int32 pdwEnabledOptions);
        void SetInterfaceSafetyOptions(System.Int32 riid, System.Int32 dwOptionsSetMask, System.Int32 dwEnabledOptions);
    }

并让VideoPlay实现这个接口

[Guid("2A80B21A-9E7C-40B3-88DA-CF98A6A34B3D")]
    public partial class VideoPlay: UserControl, IObjectSafety
    {
        public VideoPlay()
        {
            InitializeComponent();
        }
       
        public void GetInterfacceSafyOptions(int riid, out int pdwSupportedOptions, out int pdwEnabledOptions)
        {
            pdwSupportedOptions = 1;
            pdwEnabledOptions = 2;
        }

public void SetInterfaceSafetyOptions(int riid, int dwOptionsSetMask, int dwEnabledOptions)
        {
        }
    }

IObjectSafety接口的两个方法的实现都可以采用上面的代码来做。

6.程序集设定

接下来,我们需要对控件的程序集(OMCS_ActiveX)做一个设置,以表明其将作为一个COM组件使用。打开AssemblyInfo.cs文件,首先将ComVisible特性设置为true。其次,增加AllowPartiallyTrustedCallers特性。如下所示:

// 将 ComVisible 设置为 false 使此程序集中的类型
    // 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型,
    // 则将该类型上的 ComVisible 特性设置为 true。
    [assembly: ComVisible(true)]
    [assembly: AllowPartiallyTrustedCallers()]

最后,在项目属性的“生成”页中,将“为COM互操作注册”的CheckBox勾上。

7.制作安装程序

在当前解决方案中添加一个新的安装项目;

将上面的项目的主输出导入到安装项目的“应用程序文件夹”下面;

修改主输出的文件安装属性中的Register项为vsdrpCOM;

编译安装项目,将会生成两个文件setup.exe、Setup1.msi。将它们拷贝到网站虚拟目录的根目录下。

8.Web集成

现在我们写一个最简单的HTML来试试加载视频播放的ActiveX控件:

<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title></title>
</head>
<body>
<form id="form1">
       <table>
  <tr>
   <td align="center">
    <object id="videoplayer"
     classid="clsid:{2A80B21A-9E7C-40B3-88DA-CF98A6A34B3D}" codebase="VideoPlaySetup.msi" width="500" height="600">
    </object>
   </td>
  </tr>
</table> 
</form>
 </body>
</html>

这个Classid就是我们在VideoPlay.cs的Guid里的序列号,浏览器是通过GUID来定位ActiveX控件的,如果本机不存在目标ActiveX控件,则自动下载codebase属性指示的安装程序进行安装。

将HTML文件部署好后,可以打开网页,需要允许浏览器加载activeX。

9.cab文件制作

当然,也可做成cab文件嵌入网页,需要如下工具:

cabarc.exe:微软提供的cab打包工具

VideoPlaySetup.msi:  项目生成的部署安装文件

install.inf : 需要跟ActiveXSetup.msi打包在一起的文件

build.bat:  打包的批处理命令

其中,install.inf文件内容如下:

[version]
signature="$CHICAGO$"
AdvancedINF=2.0

[Setup Hooks]
hook1=hook1

[hook1]
run=msiexec.exe /i "%EXTRACT_DIR%\VideoPlaySetup.msi" /qn

build.bat内容如下:

"cabarc.exe"  n VideoPlaySetup.cab VideoPlaySetup.msi install.inf

运行一下bat就可以生成一个cab文件,在网页中,将原来的msi文件换成cab文件即可。

<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title></title>
</head>
<body>
<form id="form1">
       <table>
  <tr>
   <td align="center">
    <object id="videoplayer"
     classid="clsid:{2A80B21A-9E7C-40B3-88DA-CF98A6A34B3D}" codebase="VideoPlaySetup.cab" width="500" height="600">
    </object>
   </td>
  </tr>
</table> 
</form>
 </body>
</html>

以上就是我的制作过程,如有不正确之处,还望指正。

参考文章

http://www.it165.net/pro/html/201209/3743.html

http://www.cnblogs.com/li-peng/p/3455247.html

http://www.cnblogs.com/qishichang/archive/2010/02/28/1675213.html

Q&A

1.如果编译时,提示你权限不够(Windows 7 UAC),需要以管理员运行Visual Studio。

2.如果编译时,The assembly could not be converted to a type library. Type library exporter
encountered an error while processing 'xxxxxx'. Error: 找不到元素.

在Relase 下进行编译。

3.如果其他计算机通过IE查看该网页,acitveX没有安装,网页上只有一个红叉,则有可能是对应版本的.netframework没有安装。

C#制作activeX控件相关推荐

  1. C#制作ActiveX控件中调用海康SDK的问题

    事情是这样的,有一台海康威视的摄像头,客户需要一个ActiveX控件嵌入到网页中,通过点击按钮开始录制和结束录制来进行视频的录制和保存,关于海康摄像头的二次开发在此就不多说了,可以参考SDK中的说明. ...

  2. VC ActiveX 控件 开发总结

    VC 制作ActiveX 控件(OCX) http://ileson.iteye.com/blog/1002910 1.vc6下建立一下activeX工程     详见http://hi.baidu. ...

  3. 如何在 ActiveX 控件中使用字体

    字体的使用是ActiveX控件制作过程中不可缺少的部分.本文将深入浅出地介绍在ActiveX控件中制作过程中如何使用字体.本文所提及的ActiveX控件制作是指利用VC++6.0的MFC Active ...

  4. excel不能插入activex控件_办公小技巧:制作更炫酷的Excel下拉菜单

    在Excel中制作下拉菜单,大都是利用数据有效性,再有就是表单控件中的组合框.数据有效性或表单控件组合框制作下拉菜单,快捷.便利.实用.功能很全面,但也有力所不及的地方,比如设置下拉菜单的字体.颜色. ...

  5. C#开发ActiveX控件及制作CAB包

    一个项目要用到 ActiveX 控件,参照网上众多的例子,ActiveX控件倒是很容易就搞出来了: 然后做了一个[ 安装项目],倒是可以使用,只不过需要在客户端手动点击安装,下一步,下一步-觉得不是很 ...

  6. VLC media player ActiveX控件制作

    昨天折腾折腾这个折腾了一天.大致干了这几件事: 一,重新制作VLC安装包,去掉一些不必要的东东,设置一些必要的东东 二,制作ActiveX cab包 三,给CAB包加数字签名 四,调用代码 一,重新制 ...

  7. C#BS通过ActiveX控件及制作CAB包来调CS

    1) 创建Visual Studio解决方案 "ActiveXSolution". 2)在解决方案ActiveXSolution中添加 Windows窗体应用程序 "CS ...

  8. 如何发布ActiveX 控件

    转自:http://blog.csdn.net/zougangx/archive/2008/07/30/2738147.aspx [背景] 做过ActiveX控件的朋友都知道,要想把自己做的Activ ...

  9. Asp.Net 中使用客户端Activex控件需要注意的事情

    案例:Asp.Net +VB制作的Activex控件 操作系统:Windows2003 +Sp1 现象1:通过     <OBJECT classid="CLSID:132A80F5- ...

最新文章

  1. AI假新闻满天飞,打假神器GROVER帮你看清一切
  2. 用jstl截取字符串
  3. SuSE sftp限制用户活动目录
  4. alexnet 论文翻译
  5. 银河麒麟 安卓nginx_银河麒麟Kydroid 2.0全新发布:原生支持海量安卓APP
  6. NBA球星为啥那么多顶薪?数据可视化为你揭晓真相
  7. 微型计算机普遍采用的数字编码是,计算机原理复习题1
  8. 【技巧总结】string和char[]之前的相互转换(c_str()+strcpy+stringstream.str())
  9. SQL2008卸载。
  10. 第八章 软件项目团队管理
  11. python分苹果问题_蓝桥杯--算法提高--VIP--分苹果题目(差分数组)
  12. 面试:计算机网络基础详解(一)
  13. 【测绘程序设计试题集】 试题04 最短路径计算
  14. 【系统】【winget】从零开始配置一个开发用的 Windows 11 系统的电脑 - winget 代码终端安装软件
  15. UNIX的spctl命令
  16. Shp2osm:shp转换为osm格式文件
  17. 6.14 PowerBI系列之DAX函数专题-重点之集合函数UNION、INTERSECT、 except、crossjoin、generate
  18. 标题:2017-2018-20172309《程序设计与数据结构》课程总结
  19. 计算机仿真气垫上的直线运动验报告,在气垫导轨上测加速度的实验报告.doc
  20. Excel去重并进行统计(对列)

热门文章

  1. 前端中的A端、B端、C端
  2. 服务器银河麒麟系统按装步骤,配置麒麟操作系统安装手册
  3. 记录一次解决VScode字体问题经历
  4. 云呐|固定资产管理系统的主要功能有哪些
  5. Github-hexo搭建个人博客
  6. 蔡高厅高等数学 06 数列极限的定义、数列收敛的性质1
  7. Newtonsoft.Json Sample文档
  8. 关于编程思想POP,OOP个人理解
  9. 计算机电源MOD,自制模组板给黑群电源改模组
  10. 浅谈视觉外观检测系统中存在哪几大技术难点?