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

[version]
signature="$CHICAGO$"
AdvancedINF=2.0 [Setup Hooks]
hook1=hook1 [hook1]
run=msiexec.exe /i "%EXTRACT_DIR%\ActiveXSetup.msi" /qn

build.bat

"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. 模板方法模式&策略模式区别联系

    一.模板方法 模板方法模式:定义 一系列算法, 子类延伸实现.着重点在于:子类去处理不同的方法实现. 看下面例子. 假如一个支付 都包含三个部分: 生成订单 ---->调用API发起支付---- ...

  2. 1.2python基础_数字类型_数字(Number)类型

    一.整型(int型.整数) 整型 等价于C中的有符号长整型(long) 与系统的最大整型一致(如32位机器上的整型是32位,64位机器上的整型是64位), 可以表示的整数范围在[-sys.maxint ...

  3. spring AOP 编程--AspectJ注解方式 (4)

    1. AOP 简介 AOP(Aspect-Oriented Programming, 面向切面编程): 是一种新的方法论, 是对传统 OOP(Object-Oriented Programming, ...

  4. ReadyAPI 教程和示例(一)

    原文:ReadyAPI 教程和示例(一) 声明:如果你想转载,请标明本篇博客的链接,请多多尊重原创,谢谢! 本篇使用的 ReadyAPI版本是2.5.0 通过下图你可以快速浏览一下主要的ReadyAP ...

  5. Activiti常用类介绍

    为什么要使用工作流? 传统的设计在流程发生变化时的弊端: 1. 流程相关的属性和业务对象的属性,都放到了业务对象中. 2. 流程相关的逻辑和业务逻辑,都放到的业务逻辑中 常用类 ProcessEngi ...

  6. Atcoder arc085

    C:HSI 期望模型,不想说. #include<cstdio> using namespace std; typedef long long ll; int main() { int n ...

  7. Idea安装Mevn

    1.下载mevn安装包. 下载地址:http://maven.apache.org/ 点击Download 2.下面这两个选哪个都可以,取决于你用什么方式解压 3.把下载好的安装包解压到一个没有中文的 ...

  8. 漫说安全|智能的云WAF,开挂的Web防御

    “漫说安全”是我们推出的一个新栏目,以简洁明了的形式展现高深晦涩的云安全. 今天我们要讲的是智能的云WAF到底有啥“本领”,答案就在漫画里^_^ 漫画看完后估计你还会有些小疑问,不要着急,安全君特意准 ...

  9. csp-s模拟测试55 联,赛,题题解

    题面:https://www.cnblogs.com/Juve/articles/11610969.html 联: 用线段树维护区间和,要修改成1或0就线段树修改区间和 如果是异或,那么新的区间和就是 ...

  10. 0819NOIP模拟测试赛后总结

    这次挂得很悲伤. T1.T3我都想到正解了…… 结果T1少看了个条件:20%保证ai互不相等.以为100%…… 然后挂到了20分,赛后加了个set不到1分钟就A掉了.. T2把分骗满跑路. T3sb线 ...