1.创建ActiveX控件——按钮

2.定义一个接口,并在控件中实现

3.部署安装

4.CAB打包

5.添加到网页中进行测试

一.
创建ActiveX控件——按钮

1.新建一个Window窗体控件库项目,命名为ActiveXDemo.

2.在自动生成的UserControl1页面上添加一个button

3.点击事件里我们只弹出一个MesageBox

  1. private void button1_Click(object sender, EventArgs e)
  2. {
  3. MessageBox.Show("Active is working now!");
  4. }

4.在右边解决方案资源管理器的ActiveXDemo项目上右键→属性→应用程序→程序集信息→使程序集COM可见(M)。再切换到“生成”标签→勾选“为COM互操作注册”。

5.打开Properties里面的AssemblyInof.cs文件,添加如下代码:

6.为控件创建GUID:工具→创建GUID,选5,点击复制

7.打开UserControl1.cs,在public partial class UserControl1 : UserControl上面粘贴上一步生成的GUID,并添加using System.Runtime.InteropServices;

代码如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Drawing;
  5. using System.Data;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10. using System.Runtime.InteropServices;
  11. namespace ActiveXDemo
  12. {
  13. [Guid("73D3BE6A-E3B3-46F7-AFFE-8673390DA3F6")]
  14. public partial class UserControl1: UserControl
  15. {
  16. public UserControl1()
  17. {
  18. InitializeComponent();
  19. }
  20. private void button1_Click(object sender, EventArgs e)
  21. {
  22. MessageBox.Show("ActiveX is working now!");
  23. }
  24. }
  25. }

二、定义一个接口,并在控件中实现

创建一个IObjectSafety接口,让ActiveX 控件获取客户端的信任。

1.右键ActiveXDemo项目—>添加—>新建项→Visual C#项→接口

注意接口内容是固定的不要修改!!!也就是说你直接复制粘贴就可以用了,不要管里面的序列号,跟上面生成的GUID不是一回事。

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

2.在UserControl1控件的后台代码UserControl1.cs中实现这个接口,代码如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Drawing;
  5. using System.Data;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10. using System.Runtime.InteropServices;
  11. namespace ActiveXDemo
  12. {
  13. [Guid("73D3BE6A-E3B3-46F7-AFFE-8673390DA3F6"), ProgId("ActiveXDemo.UserControl1"), ComVisible(true)]
  14. public partial class UserControl1 : UserControl, IObjectSafety
  15. {
  16. #region IObjectSafety 成员 格式固定
  17. private const string _IID_IDispatch = "{00020400-0000-0000-C000-000000000046}";
  18. private const string _IID_IDispatchEx = "{a6ef9860-c720-11d0-9337-00a0c90dcaa9}";
  19. private const string _IID_IPersistStorage = "{0000010A-0000-0000-C000-000000000046}";
  20. private const string _IID_IPersistStream = "{00000109-0000-0000-C000-000000000046}";
  21. private const string _IID_IPersistPropertyBag = "{37D84F60-42CB-11CE-8135-00AA004BB851}";
  22. private const int INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x00000001;
  23. private const int INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x00000002;
  24. private const int S_OK = 0;
  25. private const int E_FAIL = unchecked((int)0x80004005);
  26. private const int E_NOINTERFACE = unchecked((int)0x80004002);
  27. private bool _fSafeForScripting = true;
  28. private bool _fSafeForInitializing = true;
  29. public int GetInterfaceSafetyOptions(ref Guid riid, ref int pdwSupportedOptions, ref int pdwEnabledOptions)
  30. {
  31. int Rslt = E_FAIL;
  32. string strGUID = riid.ToString("B");
  33. pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;
  34. switch (strGUID)
  35. {
  36. case _IID_IDispatch:
  37. case _IID_IDispatchEx:
  38. Rslt = S_OK;
  39. pdwEnabledOptions = 0;
  40. if (_fSafeForScripting == true)
  41. pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER;
  42. break;
  43. case _IID_IPersistStorage:
  44. case _IID_IPersistStream:
  45. case _IID_IPersistPropertyBag:
  46. Rslt = S_OK;
  47. pdwEnabledOptions = 0;
  48. if (_fSafeForInitializing == true)
  49. pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA;
  50. break;
  51. default:
  52. Rslt = E_NOINTERFACE;
  53. break;
  54. }
  55. return Rslt;
  56. }
  57. public int SetInterfaceSafetyOptions(ref Guid riid, int dwOptionSetMask, int dwEnabledOptions)
  58. {
  59. int Rslt = E_FAIL;
  60. string strGUID = riid.ToString("B");
  61. switch (strGUID)
  62. {
  63. case _IID_IDispatch:
  64. case _IID_IDispatchEx:
  65. if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_CALLER) && (_fSafeForScripting == true))
  66. Rslt = S_OK;
  67. break;
  68. case _IID_IPersistStorage:
  69. case _IID_IPersistStream:
  70. case _IID_IPersistPropertyBag:
  71. if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_DATA) && (_fSafeForInitializing == true))
  72. Rslt = S_OK;
  73. break;
  74. default:
  75. Rslt = E_NOINTERFACE;
  76. break;
  77. }
  78. return Rslt;
  79. }
  80. #endregion
  81. public UserControl1()
  82. {
  83. InitializeComponent();
  84. }
  85. private void button1_Click(object sender, EventArgs e)
  86. {
  87. MessageBox.Show("ActiveX is working now!");
  88. }
  89. }
  90. }

注意

  1. [Guid("73D3BE6A-E3B3-46F7-AFFE-8673390DA3F6")]

变成了

  1. [Guid("73D3BE6A-E3B3-46F7-AFFE-8673390DA3F6"), ProgId("ActiveXDemo.UserControl1"), ComVisible(true)]

可能发生的问题
到目前为止,ActiveXDemo项目完工了,ActiveXDemo项目右键-->生成。

这个时候,我这边出现了一个错误:

错误 1 无法注销程序集“D:\learnActiveX\ActiveXDemo\ActiveXDemo\bin\Debug\ActiveXDemo.dll”- 拒绝访问。请确保您正在以管理员身份运行应用程序。不允许所请求的注册表访问权。ActiveXDemo

最后发现用管理员身份运行VS2012,然后打开ActiveXDemo项目,再生成,就不会报错了。

三、打包部署

1.解决方案ActiveXDemo右键-->添加新项目-->其他项目类型-->安装和部署。如果你没有安装过这个,请先安装。命名为ActiveSetup

2.选择application information:基本配置,自定义填写

3.接下来先把Application Files,点击MyCompany下的第一个节点可以自己重命名

4.点击 Add Project OutPuts,选择主输出点ok

5.ActiveSetup项目右键,生成。在ActiveSetup\Express\DVD-5\DiskImages\DISK1文件夹下有如下文件:

一个exe一个mis我们只用mis的

还要一个cabarc.exe这个我会在下载里给大家提供

 cabarc.exe:微软提供的cab打包工具

     ActiveXSetup.msi:  项目生成的部署安装文件
 
    install.inf : 需要跟ActiveXSetup.msi打包在一起的文件
 
    build.bat:  打包的批处理命令

install.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%\ActiveXSetup.msi" /qn

build.bat

  1. "cabarc.exe" n test.cab ActiveXSetup.msi install.inf

运行一下bat就可以生成一个
cab

我们随便建一个webfrom网站

在debug下边建一下dll文件夹

把test.cab放到文件夹里

cabarc.exe:微软提供的cab打包工具 地址 :files.cnblogs.com/files/dongh/cab%E5%88%B6%E4%BD%9C%E5%B7%A5%E5%85%B7.rar

C# 制作ActiveX控件并添加到网页的更多相关文章

  1. C#制作ActiveX控件及部署升级(摘自网络)

    使用C#开发ActiveX控件 控件开发.制作CAB包.签名.部署 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序 ...

  2. C#制作ActiveX控件中调用海康SDK的问题

    事情是这样的,有一台海康威视的摄像头,客户需要一个ActiveX控件嵌入到网页中,通过点击按钮开始录制和结束录制来进行视频的录制和保存,关于海康摄像头的二次开发在此就不多说了,可以参考SDK中的说明. ...

  3. Android使用shape制作圆形控件及添加弹跳动画

    --------本来为作者原创,未经同意禁止转载 前言:我们在很多时候都需要在res/drawable文件夹下创建相应的xml文件来为控件添加一些样式效果,比如按钮按下时的按钮样式变化.或者指定按钮的 ...

  4. ActiveX控件资料

    Visual Studio 2008(c#)开发ActiveX控件及制作CAB包总结(1) 分类: C#2011-05-27 15:50 403人阅读 评论(0) 收藏 举报 c#stringhook ...

  5. ActiveX控件的基本操作方法以及如何在VS2010下使用控件

    在此,小编就介绍下ActiveX控件的基本操作方法以及如何在VS2010下使用控件,我们以一个程序为例, (1)      打开VS2010编译器(右键以管理员身份运行,因为ActiveX需要注册), ...

  6. ActiveX控件是什么?

    一.ActiveX的由来 ActiveX最初只不过是一个商标名称而已,它所涵盖的技术并不是各自孤立的,其中多数都与Internet和Web有一定的关联.更重要的是,ActiveX的整体技术是由Micr ...

  7. Delphi 编写ActiveX控件(OCX控件)的知识和样例(有详细步骤)

    一.ActiveX应用情况简介: ActiveX控件也就是一般所说的OCX控件,它是 ActiveX技术的一部分.ActiveX是微软公司推出的基于组件对象模型COM的技术,包括对Windows 32 ...

  8. 用delphi制作无界面的activex控件

    首先,您要了解: •COM的基本原理 •能被网页调用的非可视ActiveX控件必须是一种至少实现了IOleObject接口的TAutoObject组件 •利用Delphi向导生成的ActiveX控件必 ...

  9. 如何给ActiveX控件添加“事件”“属性”“标准事件”“自定义事件”等一些相关操作

    上一篇小编带大家熟悉了一下ActiveX的建立以及相关的概念,(http://blog.csdn.net/u014028070/article/details/38424611) 本文介绍下如何给控件 ...

随机推荐

  1. 初探Remax微信小程序

    1.创建项目 npx degit remaxjs/template-wechat my-app cd my-app && npm install 2.运行项目 npm run dev ...

  2. laydate实现设置最小时间为当前时间

    当前时间之前的日期不能选择,添加个min,主要代码如下: var now = new Date(); startTime= laydate.render({ elem: '#test1', type: ...

  3. div contenteditable 重新编辑时focus光标定位到前面问题解决

    <div class="editdiv" id="edit" contenteditable="true">这是添加文字< ...

  4. day09 samba、nginx服务配置

    samba 1.环境准备 [root@localhost ~]# iptables -F #清除防火墙配置 [root@localhost ~]# systemctl stop firewalld # ...

  5. thinkphp 关联关系

    关联关系 通常我们所说的关联关系包括下面三种: 大理石平台等级 一对一关联 :ONE_TO_ONE,包括HAS_ONE 和 BELONGS_TO 一对多关联 :ONE_TO_MANY,包括HAS_MA ...

  6. ThinkPHP实现了ActiveRecords模式的ORM模型

    ThinkPHP实现了ActiveRecords模式的ORM模型,采用了非标准的ORM模型:表映射到类,记录映射到对象.最大的特点就是使用方便和便于理解(因为采用了对象化),提供了开发的最佳体验,从而 ...

  7. C#一般处理程序设置和读取session(session报错“未将对象引用设置到对象的实例”解决)

    登陆模块时,用到了session和cookie.在一般处理程序中处理session,一直报错.最后找到问题原因是需要调用 irequiressessionstate接口. 在ashx文件中,设置ses ...

  8. webpack静态资源拷贝插件

    处理不需要使用webpack统一打包处理或webpack不支持的文件 安装 npm install copy-webpack-plugin --save-dev 配置 const copyWebpac ...

  9. JAVA基础_可变参数

    自JAVA1.5以来,在JAVA中出现了可变参数一说,其针对的情况是对多个不确定的相同类型的元素进行同一类操作的情形. 可变参数有点类似与重载的概念,但是其中的可变参数是被隐式的转换成数组来进行处理的 ...

  10. robocopy——Windows下的高效文件拷贝

    1. 基本用法 C:\Users\>RoboCopy /? ------------------------------------------------------------------- ...