C# VS2010 编写 ActiveX

    xiaoxiao2024-11-04  82

    一、Win7下编写ActiveX控件,用作B/S插件。ActiveX只能用于ie内核的浏览器。

    参考:

    https://blog.csdn.net/hzh839900/article/details/54924944

    https://www.cnblogs.com/boonya/p/8657369.html

    二、创建方法

    2.1 新建项目,选择Windows窗体控件,我选用的是.net 2.0 其它默认的窗体控件,

    2.2 在新建的项目中点击右键进入项目配置界面,点击“程序集信息(I)”

    2.3 在程序集信息界面里勾选“使程序集com可见”

    2.4 点击项目配置界面“生成”,勾选“为com互操作注册”

    2.5 打开项目的AssemblyInfo.cs 文件,加入[assembly: AllowPartiallyTrustedCallers()] 参数及using System.Security 引用。

    三、ActiveX类库接口及成员继承及实现。

    3.1 完成上述二的步骤已可生成一个可用作调试的dll及tld文件,据参考介绍要取得web浏览器的信任还必须实现一个名为“IObjectSafety”的接口及其成员。

    3.2 创建IObjectSafety.cs接口文件及复制一下代码,并添加相关引用。

     [ComImport, Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064")]     [InterfaceType(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);

    }

    3.3 vs2010 工具 -->创建GUID 复制一个新建的GUID。

    3.4 打开控件文件UserControl1.cs 把新建的GUID 复制到控件类的顶部并继承IObjectSafety接口

    3.5 复制以下代码到控件类里头,实现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.6 在UserControl1.cs 的可视化界面上拖进个button1。

     

    3.7 双击button1 生成button1_Click事件,并创建一个名为Test1的测试方法,并在button1_Click中调用Test1函数。

    3.8 点击“启动调试”运行如下

     

     

     

    四、Asp.net 及js 调试并静态调用此ActiveX控件

    4.1 在没有生成cab或msi文件前此控件可以用作一般的调试使用。

    4.2 新建一个Asp.net 网站项目,在项目里添加一个dll文件夹,并把上述ActiveX 插件目录bin\Debug\里的ActiveXPf.dll及ActiveXPf.tlb文件添加到dll目录里头。

    4.3 在一个Default.aspx 文件里添加一个object元素

    id="Object1"

    classid="clsid:6DB586EE-32F4-4C38-8D81-F2153D2DE72E"  即刚才用GUID生成并放置控件类顶头的那串字符

    codebase="/dll/ActiveXPf.dll"

    4.4  设置ie 浏览器 Internet 选项 -->安全 本地Intranet中的ActiveX控件和插件

    "ActiveX 控件自动提示" 启用

    “对未标记为可安全执行脚本的ActiveX控件初始化并....”启用

    “下载未签名的ActiveX 控件” 启用

    “运行 ActiveX 控件和插件” 启用 

    4.5 启动调试Asp.net Default.aspx页面

    4.6 js传参及调用ActiveX

    4.6.1 在Asp.net的Scripts文件价加入一个js文件 名为Testjs.js,并复制如下代码

    function Test1() {     try {         var p = document.getElementById("Object1");         var s = p.Test1("你好!");         alert(s);     }     catch (e) {         alert('错误2 ' + e.message + ' 发生在 ' + e.lineNumber + ' 行 ' + s);     } }

    4.6.2 在Default.aspx 页面中加入一个input button,并引入Testjs.js文件     <input type="button" οnclick="Test1()" value="别按我" />     <script src="Scripts/Testjs.js" type="text/javascript"></script>

    4.6.3 启动调试Default.aspx页面 并点击 input 里的“别按我” button ,ie11弹出如下提示

    查找原因原来是ie的ActiveX插件设置问题,要把“对未标记为可安全执行脚本的ActiveX 控件初始化并...”从提示设置为启动。

    再次点击“别按我”button出现两个提示,表示js调用ActiveX成功。

    五、生成cab文件及签名发布等操作。

    略...

    最新回复(0)