这几天Web项目中需要用到ActiveX插件(PS:听说这个是好久好久的东西了。。。),由于项目中需要调用本地资源所以只能研究研究这位老兄了。

先说说自己学习他的经历,开始的时候是用百度引擎检索自己所需要的数据,但是明显没有收获啊。只能FQ出去用Google了,Google真的很厉害,也希望大家都要习惯使用百度。在百度中找到了几篇比较详细的博客文章,按照他们的思路走了一遍虽然可以打包成*.cab文件但是无论是签名还是显示都会或多或少有那么一些不足。紧接着又是一天的各种Google呀。研究了近3天终于有个模样出来了。为了防止自己忘记再者为了和有需要的网友分享一下自己的心得,如有错误的地方请大家在下方指点出来以免误导其他人。

  思路:

  1、自定义一个【用户控件】

  2、打包发布成【*.msi】文件

  3、利用【cabarc.exe】工具把【*.msi】文件【*.inf】文件打包成【*.cab】文件

  图文笔记开始:

  1、新建一个【Windows窗体控件库】项目

  2、编写自己的控件功能,本控件只实现一个弹窗

  3、新建一个名为【IObjectSafety】的接口、注:接口内容下文将给出、不用修改任何代码!!!

 using System;
 using System.Collections.Generic;
 using System.Text;
 using System.Runtime.InteropServices;

 namespace EasyActivex
 {

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

  4、自定义控件类继承并实现【IObjectSafety】接口、注:实现【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 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 = ;
                    if (_fSafeForScripting == true)
                        pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER;
                    break;
                case _IID_IPersistStorage:
                case _IID_IPersistStream:
                case _IID_IPersistPropertyBag:
                    Rslt = S_OK;
                    pdwEnabledOptions = ;
                    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

  5、给自定义控件类设置一个【GUID标签】,注:此【GUID】值为页面中【OBJECT】标签所引用的【classid】

  需要引入命名控件

using System.Runtime.InteropServices;
[Guid("A212CB6C-F833-454C-9CD2-C38A36386DE3")]

  提示:GUID可以用【VS2010】环境任务栏中【工具】菜单下的【新建GUID】生成,如下图

  6、在项目结构中打开【Properties】文件夹中的【AssemblyInfo】写入下面这句话

[assembly: AllowPartiallyTrustedCallers()]

  7、【项目】点击右键打开【属性窗口】打开【程序集信息】勾选【使程序集COM可见】

  8、左侧点击【生成】选项卡勾选【为COM互操作注册】、左上角【配置】切换为【Release】勾选下方【为COM互操作注册】,保存关闭【属性】窗口

  9、以上则完成了ActiveX功能的开发、下面新建【安装项目】给【*.dll】文件发布成【*.msi】文件

  10、在引进来的【*.dll】文件单击右键【属性】修改【Register】为【vsdraCOM】

  11、把用户自定义控件的【dll】添加到【安装项目】并重新生成【安装项目】则会生成一个【*.msi】文件,到此功能开发与发布完成

  12、下面将进行【*.msi】文件打包成【*.cab】文件、首先准备工作是下载【cabarc.exe】工具、新建一个【*.inf】配置文件下文将给出

[version]
signature="$CHICAGO$"
AdvancedINF=2.0  

[Setup Hooks]
hook1=hook1  

[hook1]
run=msiexec.exe /i "%EXTRACT_DIR%\Setup1.msi" /qn

  13、用批处理文件生成【*.cab】文件

 n Setup1.cab install.inf Setup1.msi
ping -n  127.0.0.1 >nul

  14、4个文件都准备好后双击批处理文件将生成【*.cab】文件,到此C#开发ActiveX已经完成

  后续将介绍如何签名。话说我不知道怎么挂文件啊。。。用到的工具大家自行下载吧。。。

【CSharp】C#开发ActiveX插件的更多相关文章

  1. C#开发ActiveX插件-aspx中嵌入

    刚到新的公司,第一周让我熟悉一下他们用的silverlight和arcgis.这周,也就是昨天分配了我一个小小的任务! 哪个项目的不知道,是让我实现一个在aspx中嵌入activeX插件! 在网上找了 ...

  2. VS2012开发ActiveX插件 尝试1

    今天闲来无聊研究了下 ActiveX插件开发,以前一直以为很牛逼,然后发现还是比较简单的东西.. 首先: 在开始前 准备好 VS12开发工具,cabarc.exe 工具(注:这是 用来 将文件打包成c ...

  3. 一种C#开发ActiveX的思路

    由于某些原因,不得不在C#下开发ActiveX插件,而这会带来很多问题,主要有无法在线安装.无法自动更新.由于本人水平有些,这两个问题不一定是这样,如果有大侠知道C#下开发ActiveX插件可实现在线 ...

  4. vs2010开发activex(MFC)控件/ie插件(一)

    原文:http://blog.csdn.net/yhhyhhyhhyhh/article/details/50782904  vs2010开发activex(MFC)控件:      第一步:生成ac ...

  5. javascript检测ActiveX插件是否安装/启用

    本文主要提供在IE浏览器下检测ActiveX插件安装/启用的状态. 在一些应用开发中,需要用到一些第三方提供的ActiveX插件,如Flash插件. 为了在未安装插件的浏览器显示友好的提示,需要用到主 ...

  6. [转]C#开发ActiveX控件,.NET开发OCX控件案例

    引自:百度   http://hi.baidu.com/yanzuoguang/blog/item/fe11974edf52873aaec3ab42.html 讲下什么是ActiveX控件,到底有什么 ...

  7. 非IE内核浏览器支持activex插件

    之前在一个B/S项目中遇到一个需求,就是客户需要在页面上对报表的布局以及显示内容,进行自定义.最后决定使用activex技术来实现.众所周知,activex是微软搞得,因此只有ie内核的浏览器才能支持 ...

  8. Delphi XE7 开发ActiveX 及在IntraWeb下调试

    最近学习DelphiXE7下Intraweb开发,Intraweb完全服务器端运行使得FastReport报表系统无法在客户端运行,当然网上也有一大堆解决方案,例如导出到PDF后,给出连接,让客户点击 ...

  9. [转]使用C#开发ActiveX控件全攻略

    前言: 这段时间因为工作的需要,研究了一下ActiveX控件.总结如下: 先说说ActiveX的基本概念. 根据微软权威的软件开发指南MSDN(Microsoft Developer Network) ...

随机推荐

  1. Entity Framework的默认值BUG解决方法

    在使用.Net 3.5里的Entity Framework开发网站的时候,遇到了一个问题:添加记录时,对于DateTime型的数据,无法使用数据库的默认值. 具体的情况是这样的,我的数据库有个User ...

  2. SQL Server 存储(2/8):理解数据记录结构

    在SQL Server :理解数据页结构我们提到每条记录都有7 bytes的系统行开销,那这个7 bytes行开销到底是一个什么样的结构,我们一起来看下. 数据记录存储我们具体的数据,换句话说,它存在 ...

  3. Eclipse魔法堂:修改主题

    一.前言 习惯黑色主题,而Eclipse默认的白底主题显然不是我的菜,下面一起来修改主题吧! 二.主题资源 Eclipse Color Themes(http://eclipsecolorthemes ...

  4. JS 函数--Date()函数

    1.JavaScript没有基本的日期数据类型,所以只能显式的创建Date对象.例如:var myDate=new Date(); 2.为了创建一个存储了特定日期的,或者时间的Date对象,可以简单的 ...

  5. 重构第20天 提取子类(Extact SubClass)

    理解:提取子类就是把基类中,不是所有子类或者只有少数子类用到的方法,提取出来,调整到子类中去. 详解:下面的代码中我们用到一个单一的类Registration,来处理学生选课信息. public cl ...

  6. istView的项移除

    如标题所言,是做删除ListView绑定项的功能的:鉴于这个功能当时确实花费了很多时间,并且网上也找不到删除所需的案例,所以,我就做了一份案例,仅供各位前辈和同行进行参考,如有不当之处,还望指点,我将 ...

  7. 【Bootstrap基础学习】05 Bootstrap学习总结

    好吧,Copy了几天,这个总结算是把我对Bootstrap的一些理解写一下吧. Bootstrap只是一套别人写好的前端框架,直接拿来用就好. 不过对于专业的前端而言,如果不去把所有的代码都看一遍来理 ...

  8. KMP--Cyclic Nacklace

    题目网址:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=110060#problem/D Description CC always be ...

  9. java jdk environment variables

    1. create system variable 2. edit the system path note: ;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; 3. cre ...

  10. ahjesus不断完善的js小"内裤"

    String.prototype.isNullOrWhiteSpace = function () { /// <summary> /// 变量是undefined或者null或者空字符串 ...