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

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

  思路:

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

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

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

  图文笔记开始:

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

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

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

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Runtime.InteropServices;
  5.  
  6. namespace EasyActivex
  7. {
  8.  
  9. [ComImport, GuidAttribute("CB5BDC81-93C1-11CF-8F20-00805F2CD064")]
  10. [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
  11. public interface IObjectSafety
  12. {
  13. [PreserveSig]
  14. int GetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] ref int pdwSupportedOptions, [MarshalAs(UnmanagedType.U4)] ref int pdwEnabledOptions);
  15.  
  16. [PreserveSig()]
  17. int SetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] int dwOptionSetMask, [MarshalAs(UnmanagedType.U4)] int dwEnabledOptions);
  18. }
  19. }

  4、自定义控件类继承并实现【IObjectSafety】接口、注:实现【IObjectSafety】接口部分下文将给出、不用修改任何代码

  1. #region IObjectSafety 接口成员实现(直接拷贝即可)
  2.  
  3. private const string _IID_IDispatch = "{00020400-0000-0000-C000-000000000046}";
  4. private const string _IID_IDispatchEx = "{a6ef9860-c720-11d0-9337-00a0c90dcaa9}";
  5. private const string _IID_IPersistStorage = "{0000010A-0000-0000-C000-000000000046}";
  6. private const string _IID_IPersistStream = "{00000109-0000-0000-C000-000000000046}";
  7. private const string _IID_IPersistPropertyBag = "{37D84F60-42CB-11CE-8135-00AA004BB851}";
  8.  
  9. private const int INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x00000001;
  10. private const int INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x00000002;
  11. ;
  12. private const int E_FAIL = unchecked((int)0x80004005);
  13. private const int E_NOINTERFACE = unchecked((int)0x80004002);
  14.  
  15. private bool _fSafeForScripting = true;
  16. private bool _fSafeForInitializing = true;
  17.  
  18. public int GetInterfaceSafetyOptions(ref Guid riid, ref int pdwSupportedOptions, ref int pdwEnabledOptions)
  19. {
  20. int Rslt = E_FAIL;
  21.  
  22. string strGUID = riid.ToString("B");
  23. pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;
  24. switch (strGUID)
  25. {
  26. case _IID_IDispatch:
  27. case _IID_IDispatchEx:
  28. Rslt = S_OK;
  29. pdwEnabledOptions = ;
  30. if (_fSafeForScripting == true)
  31. pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER;
  32. break;
  33. case _IID_IPersistStorage:
  34. case _IID_IPersistStream:
  35. case _IID_IPersistPropertyBag:
  36. Rslt = S_OK;
  37. pdwEnabledOptions = ;
  38. if (_fSafeForInitializing == true)
  39. pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA;
  40. break;
  41. default:
  42. Rslt = E_NOINTERFACE;
  43. break;
  44. }
  45.  
  46. return Rslt;
  47. }
  48.  
  49. public int SetInterfaceSafetyOptions(ref Guid riid, int dwOptionSetMask, int dwEnabledOptions)
  50. {
  51. int Rslt = E_FAIL;
  52. string strGUID = riid.ToString("B");
  53. switch (strGUID)
  54. {
  55. case _IID_IDispatch:
  56. case _IID_IDispatchEx:
  57. if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_CALLER) && (_fSafeForScripting == true))
  58. Rslt = S_OK;
  59. break;
  60. case _IID_IPersistStorage:
  61. case _IID_IPersistStream:
  62. case _IID_IPersistPropertyBag:
  63. if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_DATA) && (_fSafeForInitializing == true))
  64. Rslt = S_OK;
  65. break;
  66. default:
  67. Rslt = E_NOINTERFACE;
  68. break;
  69. }
  70.  
  71. return Rslt;
  72. }
  73.  
  74. #endregion

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

  需要引入命名控件

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

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

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

  1. [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】配置文件下文将给出

  1. [version]
  2. signature="$CHICAGO$"
  3. AdvancedINF=2.0
  4.  
  5. [Setup Hooks]
  6. hook1=hook1
  7.  
  8. [hook1]
  9. run=msiexec.exe /i "%EXTRACT_DIR%\Setup1.msi" /qn

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

  1. n Setup1.cab install.inf Setup1.msi
  2. 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. Android学习笔记之SoftReference软引用...

    PS:其实这一篇和上一篇很类似,都是为了解决内存不足(OOM)这种情况的发生... 学习内容: 1.对象的引用类....   最近也是通过项目中知道了一些东西,涉及到了对象的引用类,对象的引用类分为多 ...

  2. javascript中的数组扩展(一)

     javascript中的数组扩展(一) 随着学习的深入,发现需要学习的关于数组的内容也越来越多,后面将会慢慢归纳,有的是对前面的强化,有些则是关于前面的补充. 一.数组的本质    数组是按照次序排 ...

  3. DFS --- HNU 13307 Galaxy collision

    Galaxy collision Problem's Link Mean: 给定二维坐标平面内的n个整数点,让你把这n个点划分为两个集合,同一集合内的所有点必须两两距离大于5,求这两个集合的元素个数之 ...

  4. vs 2010 中类文文件模板的修改

    类模板 文件的修改,以前也修改过,这次有个同事问我,搞了有一会才搞定,这里还是记录分享下. 如果想在每次创建文件时,自动生成文档注释(注意是自动生成文档注释而不是帮助文档),如下面的代码,需要设置VS ...

  5. JS代码放置位置、变量与数据类型、运算符与逻辑表达运算符

    内容简要: 1.JS代码放置位置的问题: 2.变量与数据类型: 3.运算符与逻辑表达式的运算符   我的位置 全局问题:为何在网页推荐位置(一般在<head></head>内部 ...

  6. ASP.NET或WinFrom中获取汉子的拼音首字母

    1.获得一个字符串的每个字的拼音首字母构成所需的字符串 #region  获取首字母 /// <summary>         /// 这个办法是用来获得一个字符串的每个字的拼音首字母构 ...

  7. 【iOS】Quartz2D图形上下文

      一.绘图的完整过程 程序启动,显示自定义的view.当程序第一次显示在我们眼前的时候,程序会调用drawRect:方法,在里面获取了图形上下文(在内存中拥有了),然后利用图形上下文保存绘图信息,可 ...

  8. 实现跨域请求jsonp方式

    原理:http://madong.net.cn/index.php/2012/12/368/ 调用端: $.getJSON("http://192.168.220.85:8001/esb/a ...

  9. C++ 面向对象的三个特点--多态性(一)

    C++的多态性定义 所谓多态性就是不同对象收到相同的消息产生不同的动作.通俗的说,多态性是指一个名字定义不同的函数,这些函数执行不同但又类似的操作,即用同样的接口访问功能不同的函数,从而实现“一个接口 ...

  10. Eclipse下Android开发的问题:Installation error: INSTALL_FAILED_NO_MATCHING_ABIS 解决办法

    在Android模拟器上安装apk的时候出现   INSTALL_FAILED_NO_MATCHING_ABIS 这个错误提示的解决办法. 是由于使用了native libraries .该nativ ...