在Web中如何使用Windows控制項(ActiveX)

來源:互聯網
上載者:User
轉自:http://www.cnblogs.com/zhuweisky/archive/2012/09/14/2683599.html,特別鳴謝在Web中如何使用Windows控制項?

    最近做的一個Web項目,需要在網頁中播放網路攝影機採集的即時視頻,我們已經有了播放視頻的使用C#編寫的windows控制項,如何將其嵌入到網頁中去了?這需要使用一種古老的技術,ActiveX。

1.將.Net控制項轉化為ActiveX控制項

    首先要做的就是將我們的windows視頻播放控制項轉化為ActiveX控制項。先看看我們視頻播放控制項的定義,其基於OMCS實現,相當簡單:

    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.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);            }        }

      }

      當調用其Initialize方法時,將串連到目標使用者的網路攝影機,並在其內含的cameraConnector1控制項上播放視頻。這個控制項在Windows Form應用程式中工作良好,現在我們一步步來將其轉換為ActiveX控制項。

(1)GUID

      ActiveX控制項首先是COM組件,COM組件有唯一的GUID。後面我們可以看到,在Web中,需要通過GUID定位並載入已經註冊的ActiveX控制項。

      如果使用的是VS2010,工具菜單下有個“建立GUID”菜單,點擊它可以建立一個新的GUID,然後把其複製作為CameraVideoPlayer的特性:

    [Guid("D9906B42-56B3-4B94-B4F9-A767194A382F")]    public partial class CameraVideoPlayer : UserControl
(2)實現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);    }

      並讓CameraVideoPlayer實現這個介面:

    [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特性。如下所示:

    // 將 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。如下所示:

<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控制項一樣正常運行了:) 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.