【C++】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