C#ActiveX控件開發學習

一:C#ActiveX控件開發注意事項html

 
1:C#開發的ActiveX控件只可在裝有Framework的系統上才能用。
2:只有IE瀏覽器支持。
3:初次安裝須要導入代碼簽名證書及其證書鏈的方式,
或者Windows其實默認內置了一些權威的CA機構證書,能夠向這些機構申請一份代碼簽名證書及私鑰文件來對ActiveX控件簽名,這樣就能夠避免該問題了。可是,向權威的CA機構申請證書是須要付費的,因此須要權衡成本和易用性後,再作出選擇。
 

二:開發步驟web

ActiveX控件之前也叫作OLE控件,它是微軟IE支持的一種軟件組件或對象,能夠將其插入到Web頁面中,實如今瀏覽器端執行動態程序功能,以加強瀏覽器端的動態處理能力。一般ActiveX控件都是用C++或VB語言開發,本文介紹另外一種方式,在.NET Framework平臺上,使用C#語言開發ActiveX控件。
 

1:必須繼承並實現IObjectSafety接口瀏覽器

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

2:一般咱們會先定義這麼一個控件基類去實現改接口ui

 

ActiveXControl控件基類spa

  public abstract class ActiveXControl : IObjectSafetyorm

 {htm

     #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

 }

 

3:實現本身的ActiveX控件功能開發

 

MacActiveX控件類
 [Guid("65D8E97F-D3E2-462A-B389-241D7C38C518")]
 public class MacActiveX : ActiveXControl 
 {
     public string GetMacAddress()   
     {
         var mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
         var mos = mc.GetInstances();
         var sb = new StringBuilder();
 
         foreach (ManagementObject mo in mos)
         {
             var macAddress = mo["MacAddress"];
 
             if (macAddress != null)
                 sb.AppendLine(macAddress.ToString());
         }
 
         return sb.ToString();
     }
 }

 

 

三:使用C#開發ActiveX控件 控件開發、製做CAB包、簽名、部署

詳情見http://www.cr173.com/html/20985_1.html
相關文章
相關標籤/搜索