使用C#開發ActiveX控件


      ActiveX 是一個開放的集成平台,為開發人員、用戶和 Web生產商提供了一個快速而簡便的在 Internet Intranet 創建程序集成和內容的方法。 使用 ActiveX, 可輕松方便的在 Web頁中插入 多媒體效果、 交互式對象、以及復雜程序,創建用戶體驗相當的高質量多媒體 CD-ROM

     簡單的說,用activeXjs差不多,但是有些是js無法實現的,這個時候就可以考慮一下activeX,一般要求是在客戶端執行的程序,比如對本機的串口操作等,下面來簡單介紹下如何用C#自己開發一個activeX組件,並在web中應用

 

 更改項目屬性-應用程序-程序集信息設置,勾選使程序集 COM 可見

 

 更改項目屬性-生成設置,勾選 COM 互操作 注冊

 

 修改AssemblyInfo.cs文件,添加[assembly: AllowPartiallyTrustedCallers()]項(需要引用System.Security名稱空間): 

using System.Runtime.InteropServices;

using System.Security;

// 有關程序集的常規信息通過下列屬性集

// 控制。更改這些屬性值可修改

// 與程序集關聯的信息。

[assembly: AssemblyTitle("ActivexDemo")]

[assembly: AssemblyDescription("")]

[assembly: AssemblyConfiguration("")]

[assembly: AssemblyCompany("微軟中國")]

[assembly: AssemblyProduct("ActivexDemo")]

[assembly: AssemblyCopyright("Copyright © 微軟中國 2012")]

[assembly: AssemblyTrademark("")]

[assembly: AssemblyCulture("")]

 

// 將 ComVisible 設置為 false 使此程序集中的類型

// 對 COM 組件不可見。如果需要從 COM 訪問此程序集中的類型,

// 則將該類型上的 ComVisible 屬性設置為 true。

[assembly: ComVisible(true)]

 

// 如果此項目向 COM 公開,則下列 GUID 用於類型庫的 ID

[assembly: Guid("f5438267-5c1e-4c24-b2e0-c2f172e753a4")]

 

// 程序集的版本信息由下面四個值組成:

//

//     主版本

//      次版本

//      內部版本號

//      修訂號

//

// 可以指定所有這些值,也可以使用“內部版本號”和“修訂號”的默認值,

// 方法是按如下所示使用“*”:

// [assembly: AssemblyVersion("1.0.*")]

[assembly: AssemblyVersion("1.0.0.0")]

[assembly: AssemblyFileVersion("1.0.0.0")]

[assembly: AllowPartiallyTrustedCallers()]

 

 添加一個Windows用戶控件:

 

完成控件開發后,為了使該用戶控件作為一個ActiveX控件進行使用,還需要做以下修改:
      
首先,為控件類添加GUID,這個編號將用於B/S系統的客戶端調用時使用(可以使用 工具-創建GUID 菜單創建一個GUID): 

或者通過程序獲得

MessageBox.Show(Guid.NewGuid().ToString());

為了提高程序的安全性,以便在客戶端安裝的時候在瀏覽器提高信任度,我們需要實現接口IObjectSafety

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace ActivexDemo
{
    [ComImport, GuidAttribute( " CB5BDC81-93C1-11CF-8F20-00805F2CD064 ")]
    [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
     public  interface IObjectSafety
    {
        [PreserveSig]
         int GetInterfaceSafetyOptions( ref Guid riid, [MarshalAs(UnmanagedType.U4)]  ref  int pdwSupportedOptions, [MarshalAs(UnmanagedType.U4)]  ref  int pdwEnabledOptions);

        [PreserveSig()]
         int SetInterfaceSafetyOptions( ref Guid riid, [MarshalAs(UnmanagedType.U4)]  int dwOptionSetMask, [MarshalAs(UnmanagedType.U4)]  int dwEnabledOptions);
    }

然后在代碼中實現接口即可

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices; // Guid引用
namespace ActivexDemo
{
   
    [Guid( " 0b6ed426-9e67-4cf3-99da-8a346a98e5c6 ")]
     public  partial  class Uc : UserControl,IObjectSafety
    {
         public Uc()
        {
            InitializeComponent();
        } 
         #region IObjectSafety 成員
         private  const  string _IID_IDispatch =  " {00020400-0000-0000-C000-000000000046} ";
         private  const  string _IID_IDispatchEx =  " {a6ef9860-c720-11d0-9337-00a0c90dcaa9} ";
         private  const  string _IID_IPersistStorage =  " {0000010A-0000-0000-C000-000000000046} ";
         private  const  string _IID_IPersistStream =  " {00000109-0000-0000-C000-000000000046} ";
         private  const  string _IID_IPersistPropertyBag =  " {37D84F60-42CB-11CE-8135-00AA004BB851} ";

         private  const  int INTERFACESAFE_FOR_UNTRUSTED_CALLER =  0x00000001;
         private  const  int INTERFACESAFE_FOR_UNTRUSTED_DATA =  0x00000002;
         private  const  int S_OK =  0;
         private  const  int E_FAIL =  unchecked(( int) 0x80004005);
         private  const  int E_NOINTERFACE =  unchecked(( int) 0x80004002);

         private  bool _fSafeForScripting =  true;
         private  bool _fSafeForInitializing =  true;

         public  int GetInterfaceSafetyOptions( ref Guid riid,  ref  int pdwSupportedOptions,  ref  int pdwEnabledOptions)
        {
             int Rslt = E_FAIL;

             string strGUID = riid.ToString( " B ");
            pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;
             switch (strGUID)
            {
                 case _IID_IDispatch:
                 case _IID_IDispatchEx:
                    Rslt = S_OK;
                    pdwEnabledOptions =  0;
                     if (_fSafeForScripting ==  true)
                        pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER;
                     break;
                 case _IID_IPersistStorage:
                 case _IID_IPersistStream:
                 case _IID_IPersistPropertyBag:
                    Rslt = S_OK;
                    pdwEnabledOptions =  0;
                     if (_fSafeForInitializing ==  true)
                        pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA;
                     break;
                 default:
                    Rslt = E_NOINTERFACE;
                     break;
            }

             return Rslt;
        }

         public  int SetInterfaceSafetyOptions( ref Guid riid,  int dwOptionSetMask,  int dwEnabledOptions)
        {
             int Rslt = E_FAIL;
             string strGUID = riid.ToString( " B ");
             switch (strGUID)
            {
                 case _IID_IDispatch:
                 case _IID_IDispatchEx:
                     if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_CALLER) && (_fSafeForScripting ==  true))
                        Rslt = S_OK;
                     break;
                 case _IID_IPersistStorage:
                 case _IID_IPersistStream:
                 case _IID_IPersistPropertyBag:
                     if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_DATA) && (_fSafeForInitializing ==  true))
                        Rslt = S_OK;
                     break;
                 default:
                    Rslt = E_NOINTERFACE;
                     break;
            }

             return Rslt;
        }

         #endregion
    }
}

這樣ActiveX的基本設置完成了,這個時候我們就可以利用ActiveX實現自己需要的功能了,我們兩個舉個例子

一、              在頁面中放置一個文本框和一個按鈕,當點擊按鈕的時候,把ActiveX中的值傳到頁面的文本框中

二、              ActiveX的控件中放置一個按鈕,當觸發按鈕事件后,把ActiveX的值傳到頁面的文本框中

上面這兩個例子其實就是想實現如何實現js調用ActiveXActiveX調用頁面的Js的,現在我們寫一下代碼,先看看第一種情況,在ActiveX中我們寫了一個GetStr方法,用來返回一個值,然后把這個值傳到頁面中

   public string GetStr()

    {

            return "這是從ActiveX傳過來的值";

}

好了,現在我們需要新建一個安裝文件

1、   新建一個安裝項目

 

 

2、 在項目上點右鍵,【添加】->【項目輸出】,選擇上邊的項目

 

    

       

 

如果有多個項目,可以選擇需要安裝的項目就可以了

點擊項目,按下“F4”,設置屬性

 

    

 

3、  生成項目
會生成兩個文件,一個exe文件和一個msi文件

    

  

然后把這兩個文件拷到項目的lib文件夾下面

1、  新建一個頁面,添加下面的代碼

    <object classid="clsid:0b6ed426-9e67-4cf3-99da-8a346a98e5c6" codebase="lib/setup.exe"

        width="200" height="40" id="helloBossma">

 </object>

     然后在頁面中添加javascript代碼,按鈕和文本框

   

< head  runat ="server" >
     < title >無標題頁 </ title >
     < script  type ="text/javascript" >
       
function  passValue()
       {  
 document.getElementById(
" textValue " ).value = document.getElementById( " helloBossma " ).GetStr();
       }
    
</ script >
</ head >
< body >
     < object   classid ="clsid:0b6ed426-9e67-4cf3-99da-8a346a98e5c6"  codebase ="lib/setup.exe"
        width
="200"  height ="40"  id ="helloBossma" >
     </ object >
     < form  id ="form1"  runat ="server" >
     < div >
         < input  id ="textValue"  type ="text"   />
         < input  id ="Button1"  type ="button"  value ="傳值"  onclick ="passValue()" />
     </ div >
     </ form >
</ body >
</ html >

 

這個時候我們就可以打開瀏覽器瀏覽頁面了

 

運行加載提示的加載項就可以了

 

這個時候我們點擊按鈕傳值就可以把ActiveX中的值傳過來了

 

 

接着看看如何用ActiveX調用Javascript

首先在ActiveX中寫一個方法用來將頁面的js函數傳過來。

頁面的js函數

     window.onload=function()

       {

          document.getElementById("helloBossma").regJs(window,"show");

       }

       function show(str)

       {

          document.getElementById("text1").value=str;

       }

ActiveX中我們需要添加引用

 

using mshtml;

         private IHTMLWindow2 temphtml =  null;
         private  string functionstr =  "";

         public  void RegJs( object win,  string fuc)
        {
            temphtml = (IHTMLWindow2)win;
             if (temphtml !=  null && ! string.IsNullOrEmpty(fuc))
            {
                functionstr = fuc;
            }
             else
            {
                temphtml =  null;
                functionstr =  "";
                MessageBox.Show( " 注冊腳本失敗! ");
            }
        }

在控件中放置一個按鈕,觸發按鈕的onclick事件,在事件中將值傳給頁面的js,從而完成賦值

    private void button1_Click(object sender, EventArgs e)

        {

            temphtml.execScript(functionstr + "('activeX中傳值到頁面')", "JScript");  

        }

 

上面是activeX的兩個簡單應用,更多的東西可以自行研究下..

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM