版权声明:本文为博主原创文章,未经博主允许不得转载。

 
 

最近做的一个Web版的视频会议项目,需要在网页中播放来自远程摄像头采集的实时视频,我们已经有了播放远程实时视频的使用C#编写的windows控件,如何将其嵌入到网页中去了?这需要使用一种古老的技术,ActiveX。

1.将.Net控件转化为ActiveX控件

首先要做的就是将我们的windows视频播放控件转化为ActiveX控件。先看看我们视频播放控件的定义,其基于OMCS实现,相当简单:

  1. public partial class CameraVideoPlayer : UserControl
  2. {
  3. private IMultimediaManager multimediaManager;
  4. public CameraVideoPlayer()
  5. {
  6. InitializeComponent();
  7. }
  8. public void Test()
  9. {
  10. Random ran = new Random();
  11. string userID = "bb" + ran.Next(1001,9999).ToString();
  12. this.Initialize("223.4.*.*", 9900, userID, "aa01");
  13. }
  14. public void Initialize(string serverIP, int port, string userID, string targetUserID)
  15. {
  16. try
  17. {
  18. this.multimediaManager = MultimediaManagerFactory.GetSingleton();
  19. this.multimediaManager.Initialize(userID, "", serverIP, port);
  20. this.cameraConnector1.BeginConnect(targetUserID);
  21. }
  22. catch (Exception ee)
  23. {
  24. MessageBox.Show(ee.Message);
  25. }
  26. }
 public partial class CameraVideoPlayer : UserControl
{
private IMultimediaManager multimediaManager;
public CameraVideoPlayer()
{
InitializeComponent();
} public void Test()
{
Random ran = new Random();
string userID = "bb" + ran.Next(1001,9999).ToString();
this.Initialize("223.4.*.*", 9900, userID, "aa01");
} public void Initialize(string serverIP, int port, string userID, string targetUserID)
{
try
{
this.multimediaManager = MultimediaManagerFactory.GetSingleton();
this.multimediaManager.Initialize(userID, "", serverIP, port);
this.cameraConnector1.BeginConnect(targetUserID);
}
catch (Exception ee)
{
MessageBox.Show(ee.Message);
} }

当调用其Initialize方法时,将连接到目标用户的摄像头,并在其内含的cameraConnector1控件上播放视频。这个控件在Windows Form应用程序中工作良好,现在我们一步步来将其转换为ActiveX控件。

(1)GUID

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

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

  1. [Guid("D9906B42-56B3-4B94-B4F9-A767194A382F")]
  2. public partial class CameraVideoPlayer : UserControl
    [Guid("D9906B42-56B3-4B94-B4F9-A767194A382F")]
public partial class CameraVideoPlayer : UserControl

(2)实现IObjectSafety接口

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

  1. [Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
  2. public interface IObjectSafety
  3. {
  4. void GetInterfacceSafyOptions(System.Int32 riid,out System.Int32 pdwSupportedOptions,out System.Int32 pdwEnabledOptions);
  5. void SetInterfaceSafetyOptions(System.Int32 riid, System.Int32 dwOptionsSetMask, System.Int32 dwEnabledOptions);
  6. }
    [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);
}

并让CameraVideoPlayer实现这个接口:

  1. [Guid("D9906B42-56B3-4B94-B4F9-A767194A382F")]
  2. public partial class CameraVideoPlayer : UserControl, IObjectSafety
  3. {
  4. private IMultimediaManager multimediaManager;
  5. public CameraVideoPlayer()
  6. {
  7. InitializeComponent();
  8. }
  9. public void Test()
  10. {
  11. Random ran = new Random();
  12. string userID = "bb" + ran.Next(1001,9999).ToString();
  13. this.Initialize("223.4.180.116", 9900, userID, "aa01");
  14. }
  15. public void Initialize(string serverIP, int port, string userID, string targetUserID)
  16. {
  17. try
  18. {
  19. this.multimediaManager = MultimediaManagerFactory.GetSingleton();
  20. this.multimediaManager.Initialize(userID, "", serverIP, port);
  21. this.cameraConnector1.BeginConnect(targetUserID);
  22. }
  23. catch (Exception ee)
  24. {
  25. MessageBox.Show(ee.Message);
  26. }
  27. }
  28. public void GetInterfacceSafyOptions(int riid, out int pdwSupportedOptions, out int pdwEnabledOptions)
  29. {
  30. pdwSupportedOptions = 1;
  31. pdwEnabledOptions = 2;
  32. }
  33. public void SetInterfaceSafetyOptions(int riid, int dwOptionsSetMask, int dwEnabledOptions)
  34. {
  35. }
  36. }
    [Guid("D9906B42-56B3-4B94-B4F9-A767194A382F")]
public partial class CameraVideoPlayer : UserControl, IObjectSafety
{
private IMultimediaManager multimediaManager;
public CameraVideoPlayer()
{
InitializeComponent();
} public void Test()
{
Random ran = new Random();
string userID = "bb" + ran.Next(1001,9999).ToString();
this.Initialize("223.4.180.116", 9900, userID, "aa01");
} public void Initialize(string serverIP, int port, string userID, string targetUserID)
{
try
{
this.multimediaManager = MultimediaManagerFactory.GetSingleton();
this.multimediaManager.Initialize(userID, "", serverIP, port);
this.cameraConnector1.BeginConnect(targetUserID);
}
catch (Exception ee)
{
MessageBox.Show(ee.Message);
} } 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接口的两个方法的实现都可以采用上面的代码来做。

(3)程序集设定

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

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

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

这样,编译生成的产物中除了OMCS_ActiveX.dll外,还有OMCS_ActiveX.tlb(COM用到的类型库文件)。

2.制作安装程序

转化后的CameraVideoPlayer ActiveX控件会被部署在IIS服务器上,用户第一次打开网页时,在用户的机器上是不存在这个控件的,所以,需要下载安装并在用户的机器上注册该ActiveX控件。这些可以通过VS自带的制作安装程序的功能来实现,也相当简单。

(1)在当前解决方案中添加一个新的安装项目。

(2)将OMCS_ActiveX项目的主输出导入到安装项目的“应用程序文件夹”下面。

(3)修改主输出的文件安装属性中的Register项为vsdrpCOM。

(4)设置安装项目的项目属性,主要是“安装URL”项,要设置为部署时地址。

(5)如果需要,将“系统必备”中的一些项目勾上或去掉。

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

3.Web集成

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

  1. <html xmlns="http://www.w3.org/1999/xhtml" >
  2. <head>
  3. <title>摄像头视频播放器测试</title>
  4. </head>
  5. <body>
  6. <form id="form1">
  7. <table>
  8. <tr>
  9. <td align="center">
  10. <object id="cameraVideoPlayer"
  11. <strong> classid="clsid:{D9906B42-56B3-4B94-B4F9-A767194A382F}" codebase="setup.exe"</strong> width="320" height="240">
  12. </object>
  13. </td>
  14. </tr>
  15. <tr>
  16. <td align="center">
  17. <input type=button id="Button1" value="连接摄像头" onclick="javascript:doTest()"/>
  18. </td>
  19. </tr>
  20. </table>
  21. <script type="text/javascript">
  22. function doTest()
  23. {
  24. var obj = document.getElementById("cameraVideoPlayer");
  25. obj.Test();
  26. }
  27. </script>
  28. </form>
  29. </body>
  30. </html>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>摄像头视频播放器测试</title>
</head>
<body>
<form id="form1">
<table>
<tr>
<td align="center">
<object id="cameraVideoPlayer"
classid="clsid:{D9906B42-56B3-4B94-B4F9-A767194A382F}" codebase="setup.exe" width="320" height="240">
</object>
</td>
</tr>
<tr>
<td align="center">
<input type=button id="Button1" value="连接摄像头" onclick="javascript:doTest()"/>
</td>
</tr>
</table> <script type="text/javascript">
function doTest()
{
var obj = document.getElementById("cameraVideoPlayer");
obj.Test();
}
</script>
</form>
</body>
</html>

注意加粗的部分,说明了两点:

(1)浏览器是通过GUID来定位ActiveX控件的。

(2)如果本机不存在目标ActiveX控件,则自动下载codebase属性指示的安装程序进行安装。

将HTML文件部署好后,第一次打开网页,如下所示:

运行安装,完成后,页面会刷新,并可以看到ActiveX控件已经成功加载进来了。然后,点击“连接摄像头”按钮,测试一下ActiveX控件是否可以显示远程摄像头采集的视频,如下所示:

这样,嵌入到网页中的ActiveX控件就像普通的windows控件一样正常运行了:)

在Web中使用Windows控件的更多相关文章

  1. 在web中使用windows控件,实现摄像头功能

    最近做的一个Web版的视频会议项目,需要在网页中播放来自远程摄像头采集的实时视频,我们已经有了播放远程实时视频的使用C#编写的windows控件,如何将其嵌入到网页中去了?这需要使用一种古老的技术,A ...

  2. HTML5 Web app开发工具Kendo UI Web中Grid网格控件的使用

    Kendo UI Web中的Grid控件不仅可以显示数据,并对数据提供了丰富的支持,包括分页.排序.分组.选择等,同时还有着大量的配置选项.使用Kendo DataSource组件,可以绑定到本地的J ...

  3. 在Web中如何使用Windows控件(ActiveX)[转]

    最近做的一个Web项目,需要在网页中播放摄像头采集的实时视频,我们已经有了播放视频的使用C#编写的windows控件,如何将其嵌入到网页中去了?这需要使用一种古老的技术,ActiveX. 1.将.Ne ...

  4. 向ArcGIS的ToolBarControl中添加任意的windows控件的方法

    概要:在使用ArcEngine开发中,给ToolbarControl添加按钮形式的命令项相信大家都很熟悉了,因为网上的例子很多.但这种使用click调用功能的方式只能满足大部分用户在体验方面的需求,除 ...

  5. C# windows服务:C#windows服务中的Timer控件的使用

    C# windows服务程序中的Timer控件的使用问题是如何解决的呢? 今天和同事一起研究了下C# windows服务程序中的Timer控件的使用的写法. 我们在建立一个C# windows服务程序 ...

  6. 利用ArcGIS Engine、VS .NET和Windows控件开发GIS应用

    Dixon 原文  用ArcGIS Engine.VS .NET和Windows控件开发GIS应用     此过程说明适合那些使用.NET建立和部署应用的开发者,它描述了使用ArcGIS控件建立和部署 ...

  7. Ti IPNC Web网页之ActiveX控件

    Ti IPNC Web网页之ActiveX控件 本篇介绍关于TI IPNC网页中播放器相关的东西. gStudio工程中添加播放器并控制播放器 打开IPNC网页时首先会自动下载ActiveX控件并安装 ...

  8. WEB页面常用基本控件测试用例

    一.树控件的测试外观操作 1)项目中的所有树是否风格一致 2)树结构的默认状态是怎样的.比如默认树是否是展开,是展开几级?  是否有默认的焦点? 默认值是什么?展开的节点图标和颜色? 2.执行操作 1 ...

  9. 怎样在不对控件类型进行硬编码的情况下在 C#vs 中动态添加控件

    文章ID: 815780 最近更新: 2004-1-12 这篇文章中的信息适用于: Microsoft Visual C# .NET 2003 标准版 Microsoft Visual C# .NET ...

随机推荐

  1. 学android: android-studio从main开始

    android-studio 创建hello world很容易,一路next创建blank activity,再接好手机或者avd(andorid virtual device)就好了.  但是对于我 ...

  2. java编程经验积累

    1.java批量删除checkbox中选中的对象-CSDN论坛-CSDN.NET-中国最大的IT技术社区  http://bbs.csdn.net/topics/360223125 2.重定向与转发路 ...

  3. eclipse Run On Server 异常:could not load the Tomcat Server configuration at Servers\tomcat V5.0 Sertomcat

    eclipse Run On Server 异常:could not load the Tomcat Server configuration at Servers\tomcat V5.0 Serto ...

  4. C#循环语句练习2

    1.羽毛球拍15元,球3元,水2元,有200元,每一种至少买一件,问有几种买法? 2.洗发水15元,牙刷5元,香皂2元,有150元,每一种至少买一件,问有几种买法? 3.用100元钱买100只鸡,公鸡 ...

  5. EF Core CodeFirst实践 ( 使用MS SqlServer)

    这里使用 MS SQLSERVER ,网上大多使用 SQLite 先来一个CodeFirst 新建项目 这里我们选择  ASP.NET Core Web Application (.NET Core) ...

  6. 利用linux漏洞进行提权

    RHEL5—RHEL6下都可以提权 本人测试环境CenOS6.5:该方法只能用作与有root用户切换到普通用户的环境,如果是普通用户直接登录在执行最后一步的时候直接退出登录 $ mkdir /tmp/ ...

  7. AJAX 的简单用法:

    AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. AJAX 是一种用于创建快速动态网页的技术.通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以 ...

  8. 新手之自动转存DLL——20150626星期五

    -------------------菜鸟错例一:--------------------------------------------- int a=0; if() { int a = GetTy ...

  9. Java实现多线程的三种方式

    Java多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.前两种方式启动的线程没有返回值 ...

  10. JSONP和CORS两种跨域方式的简单介绍和解决方案实例

    随着软件开发分工趋于精细,前后端开发分离成为趋势,前端同事负责前端页面的展示及页面逻辑处理,服务端同事负责业务逻辑处理同时通过API为前端提供数据也为前端提供数据的持久化能力,考虑到前后端同事开发工具 ...