在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)GUIDActiveX控件首先是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开发 , 其他 ,
上一个:CMS:文章管理之视图(1)
下一个:Weblogic classloader分析