当前位置:编程学习 > 网站相关 >>

在Web中如何使用Windows控件?

   最近做的一个Web版的视频会议项目,需要在网页中播放来自远程摄像头采集的实时视频,我们已经有了播放远程实时视频的使用C#编写的windows控件,如何将其嵌入到网页中去了?这需要使用一种古老的技术,ActiveX。
 
1.将.Net控件转化为ActiveX控件
 
      首先要做的就是将我们的windows视频播放控件转化为ActiveX控件。先看看我们视频播放控件的定义,其基于OMCS实现,相当简单:
[csharp]  
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的特性:
[csharp]  
[Guid("D9906B42-56B3-4B94-B4F9-A767194A382F")]  
public partial class CameraVideoPlayer : UserControl  
(2)实现IObjectSafety接口
      当ActiveX控件在浏览器中调用的时候,往往会出现警告框,提示不安全的控件正在运行。这是由浏览器安全策略所限定的,控件通过实现IObjectSafety接口以向浏览器表明自己是合法的。在项目中增加IObjectSafety接口的定义:
[csharp]  
[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实现这个接口:
[csharp]  
[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特性。如下所示:
[csharp] 
// 将 ComVisible 设置为 false 使此程序集中的类型  
 // 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型,  
 // 则将该类型上的 ComVisible 特性设置为 true。  
 [assembly: ComVisible(true)]  
[assembly: AllowPartiallyTrustedCallers()]  
      最后,在项目属性的“生成”页中,将“为COM互操作注册”的CheckBox勾上。
      
      这样,编译生成的产物中除了OMCS_ActiveX.dll外,还有OMCS_ActiveX.tlb(COM用到的类型库文件)。
 
2.制作安装程序
 
&nbs
补充:Web开发 , 其他 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,