1. 程式人生 > >Microsoft Visual Studio .NET 2005 編寫自己的ActiveX

Microsoft Visual Studio .NET 2005 編寫自己的ActiveX

由於最近一個Web專案要用到視訊影象採集,沒有很合適的成型控制元件使用,就只能硬著頭皮自己寫了,當然VC++或者VB都可以做ActiveX,可是自己又不會VC++,VB也僅停留在讀懂的基礎上,所以就只能用C#來實現了,雖然這樣一來客戶端需要安裝.net framework,但是專案不等人,現在就動手。

第一步:新建一個解決方案 demoSolution,新增一個Windows控制元件庫專案,我們起名為demoActiveX。為便於閱讀,我們更改控制元件名字為demoControl.cs,然後拖動一個textBox控制元件到窗體上。

第二步:在demoControl類下新建公共方法Test,用於實現控制元件與客戶端指令碼的互操作,

       public void Test()
        {
            MessageBox.Show("你輸入的內容為:" + this.textBox1.Text);
        }

第三步:開啟AssemblyInfo.cs修改程式集資訊。引用System.Security名稱空間,並新增[assembly : AllowPartiallyTrustedCallers()]安全宣告,修改[assembly: ComVisible(false)]為[assembly: ComVisible(true)]使程式集Com可見。

第四步:為Com Interop註冊。右鍵demoActiveX專案屬性,在“生成”選項卡里將“為Com Interop註冊”打上勾即可。

第五步:在demoActiveX中新增名稱空間System.Runtime.InteropServices,使用工具->建立 Guid工具建立一個新的Guid{E5FD041B-8250-4cbc-B662-A73FC7988FB5},用該Guid初始化demoActiveX,該Guid即是我們要在Web頁面下引用該ActiveX的classid 。

第六步:實現IObjectSafety介面,把ActiveX控制元件標記為安全的。

介面:

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

實現:

public void GetInterfacceSafyOptions(Int32 riid, out Int32 pdwSupportedOptions, out Int32 pdwEnabledOptions)
        {
            // TODO:  新增 demoControl.GetInterfacceSafyOptions 實現
            pdwSupportedOptions = 1;
            pdwEnabledOptions = 2;
        }

        public void SetInterfaceSafetyOptions(Int32 riid, Int32 dwOptionsSetMask, Int32 dwEnabledOptions)
        {
            // TODO:  新增 demoControl.SetInterfaceSafetyOptions 實現            
        }

到現在為止整個程式已經完成,下一步我們需要做的就是如何釋出這個ActiveX

第七步:釋出。新增新Windows安裝專案 winsetup   新增專案主輸出,然後,改動ActiveX控制元件的主輸出檔案,將其Register屬性改為vsdrpCOM,很遺憾的是,安裝URL中必須使用絕對路徑,不能使用相對路徑。這意味著生成安裝程式的時候就必須確定路徑,不是很方便。在示例中,我使用了

然後生成安裝程式,並把setup.exe及winsetup.msi拷貝到虛擬目錄demoActiveX下。/

第八步:測試。編寫一個htm頁面以供測試,需要注意一點,我們在object塊中加入了codebase屬性程式碼,用於指定下載控制元件的位置。參考下面程式碼檔案。

第九步:簽名,這個就不多說了,到網上申請一個即可。

demoActiveX.cs程式碼:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace demoActiveX
{
    [Guid("E5FD041B-8250-4cbc-B662-A73FC7988FB5")]
    public partial class demoControl : UserControl, IObjectSafety
    {
        public demoControl()
        {
            InitializeComponent();
        }

        public void Test()
        {
            MessageBox.Show("你輸入的內容為:" + this.textBox1.Text);
        }

        public void GetInterfacceSafyOptions(Int32 riid, out Int32 pdwSupportedOptions, out Int32 pdwEnabledOptions)
        {
            // TODO:  新增 demoControl.GetInterfacceSafyOptions 實現
            pdwSupportedOptions = 1;
            pdwEnabledOptions = 2;
        }

        public void SetInterfaceSafetyOptions(Int32 riid, Int32 dwOptionsSetMask, Int32 dwEnabledOptions)
        {
            // TODO:  新增 demoControl.SetInterfaceSafetyOptions 實現            
        }

    }

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

}

test.htm程式碼:

<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>Untitled Page</title>
</head>
<body>
<form id="form1">
       <table>
  <tr>
   <td align="center">
    <object id="demoActiveX"
     classid="clsid:E5FD041B-8250-4cbc-B662-A73FC7988FB5" codebase="Setup.exe" Width="200" Height="100">
    </object>
   </td>
  </tr>
  <tr>
   <td align="center">
    <input type=button id="Button1" value="測試" onclick="javascript:doTest()">
  </td>
 </tr>
 </table>

<script>
 function doTest()
 {
  var obj = document.getElementById("demoActiveX");
  obj.Test();
 }
 </script>
 </form>
    </body>
</html>