ibcadmin 发表于 2014-4-15 10:33:55

C#开发ActiveX控件教程

楼主之前做的一个项目,用到第三方控件,恰巧这个第三方控件就是ActiveX控件。
今天刚好看到博客园有这个教程,转载来分享下。
一:C#ActiveX控件开发注意事项
1:C#开发的ActiveX控件只可在装有Framework的系统上才能用。
2:只有IE浏览器支持。
3:初次安装需要导入代码签名证书及其证书链的方式,
或者Windows其实默认内置了一些权威的CA机构证书,可以向这些机构申请一份代码签名证书及私钥文件来对ActiveX控件签名,这样就可以避免该问题了。但是,向权威的CA机构申请证书是需要付费的,所以需要权衡成本和易用性后,再做出选择。


二:开发步骤    ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序功能,以增强浏览器端的动态处理能力。通常ActiveX控件都是用C++或VB语言开发,本文介绍另一种方式,在.NET Framework平台上,使用C#语言开发ActiveX控件。



1:必须继承并实现IObjectSafety接口

   
   
    public interface IObjectSafety
    {
      
      int GetInterfaceSafetyOptions(ref Guid riid, ref int pdwSupportedOptions, ref int pdwEnabledOptions);

      
      int SetInterfaceSafetyOptions(ref Guid riid, int dwOptionSetMask, int dwEnabledOptions);
    }

2:通常我们会先定义这么一个控件基类去实现改接口


ActiveXControl控件基类
public abstract class ActiveXControl : IObjectSafety
{
   #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
}





页: [1]
查看完整版本: C#开发ActiveX控件教程