zoukankan      html  css  js  c++  java
  • C#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接口

        [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:通常我们会先定义这么一个控件基类去实现改接口

     

    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

     }

     

    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
  • 相关阅读:
    linux命令行挂载NTFS文件系统的移动硬盘
    windows 修改鼠标滚轮自然滚动
    spark sql 的metastore 对接 postgresql
    ubuntu 14.04 源码编译postgresql
    spark sql 对接 HDFS
    部署spark 1.3.1 standalong模式
    perl 打开二进制文件,并拷贝内容
    ubuntu 14 安装XML::Simple 模块
    linux 搭建unixODBC ,并对接 PostgreSQL 9.3.4
    sed 删除指定行
  • 原文地址:https://www.cnblogs.com/kenking/p/3659761.html
Copyright © 2011-2022 走看看