C# 制作ActiveX控件并添加到网页
1.创建ActiveX控件——按钮
2.定义一个接口,并在控件中实现
3.部署安装
4.CAB打包
5.添加到网页中进行测试
一.
创建ActiveX控件——按钮
1.新建一个Window窗体控件库项目,命名为ActiveXDemo.
2.在自动生成的UserControl1页面上添加一个button
3.点击事件里我们只弹出一个MesageBox
- private void button1_Click(object sender, EventArgs e)
- {
- MessageBox.Show("Active is working now!");
- }
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;
代码如下:
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Drawing;
- using System.Data;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- using System.Runtime.InteropServices;
- namespace ActiveXDemo
- {
- [Guid("73D3BE6A-E3B3-46F7-AFFE-8673390DA3F6")]
- public partial class UserControl1: UserControl
- {
- public UserControl1()
- {
- InitializeComponent();
- }
- private void button1_Click(object sender, EventArgs e)
- {
- MessageBox.Show("ActiveX is working now!");
- }
- }
- }
二、定义一个接口,并在控件中实现
创建一个IObjectSafety接口,让ActiveX 控件获取客户端的信任。
1.右键ActiveXDemo项目—>添加—>新建项→Visual C#项→接口
注意接口内容是固定的不要修改!!!也就是说你直接复制粘贴就可以用了,不要管里面的序列号,跟上面生成的GUID不是一回事。
- using System;
- using System.Runtime.InteropServices;
- namespace ActiveXDemo
- {
- [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);
- }
- }
2.在UserControl1控件的后台代码UserControl1.cs中实现这个接口,代码如下:
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Drawing;
- using System.Data;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- using System.Runtime.InteropServices;
- namespace ActiveXDemo
- {
- [Guid("73D3BE6A-E3B3-46F7-AFFE-8673390DA3F6"), ProgId("ActiveXDemo.UserControl1"), ComVisible(true)]
- public partial class UserControl1 : UserControl, 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
- public UserControl1()
- {
- InitializeComponent();
- }
- private void button1_Click(object sender, EventArgs e)
- {
- MessageBox.Show("ActiveX is working now!");
- }
- }
- }
注意
- [Guid("73D3BE6A-E3B3-46F7-AFFE-8673390DA3F6")]
变成了
- [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打包工具
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控件并添加到网页的更多相关文章
- C#制作ActiveX控件及部署升级(摘自网络)
使用C#开发ActiveX控件 控件开发.制作CAB包.签名.部署 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序 ...
- C#制作ActiveX控件中调用海康SDK的问题
事情是这样的,有一台海康威视的摄像头,客户需要一个ActiveX控件嵌入到网页中,通过点击按钮开始录制和结束录制来进行视频的录制和保存,关于海康摄像头的二次开发在此就不多说了,可以参考SDK中的说明. ...
- Android使用shape制作圆形控件及添加弹跳动画
--------本来为作者原创,未经同意禁止转载 前言:我们在很多时候都需要在res/drawable文件夹下创建相应的xml文件来为控件添加一些样式效果,比如按钮按下时的按钮样式变化.或者指定按钮的 ...
- ActiveX控件资料
Visual Studio 2008(c#)开发ActiveX控件及制作CAB包总结(1) 分类: C#2011-05-27 15:50 403人阅读 评论(0) 收藏 举报 c#stringhook ...
- ActiveX控件的基本操作方法以及如何在VS2010下使用控件
在此,小编就介绍下ActiveX控件的基本操作方法以及如何在VS2010下使用控件,我们以一个程序为例, (1) 打开VS2010编译器(右键以管理员身份运行,因为ActiveX需要注册), ...
- ActiveX控件是什么?
一.ActiveX的由来 ActiveX最初只不过是一个商标名称而已,它所涵盖的技术并不是各自孤立的,其中多数都与Internet和Web有一定的关联.更重要的是,ActiveX的整体技术是由Micr ...
- Delphi 编写ActiveX控件(OCX控件)的知识和样例(有详细步骤)
一.ActiveX应用情况简介: ActiveX控件也就是一般所说的OCX控件,它是 ActiveX技术的一部分.ActiveX是微软公司推出的基于组件对象模型COM的技术,包括对Windows 32 ...
- 用delphi制作无界面的activex控件
首先,您要了解: •COM的基本原理 •能被网页调用的非可视ActiveX控件必须是一种至少实现了IOleObject接口的TAutoObject组件 •利用Delphi向导生成的ActiveX控件必 ...
- 如何给ActiveX控件添加“事件”“属性”“标准事件”“自定义事件”等一些相关操作
上一篇小编带大家熟悉了一下ActiveX的建立以及相关的概念,(http://blog.csdn.net/u014028070/article/details/38424611) 本文介绍下如何给控件 ...
随机推荐
- 模板方法模式&策略模式区别联系
一.模板方法 模板方法模式:定义 一系列算法, 子类延伸实现.着重点在于:子类去处理不同的方法实现. 看下面例子. 假如一个支付 都包含三个部分: 生成订单 ---->调用API发起支付---- ...
- 1.2python基础_数字类型_数字(Number)类型
一.整型(int型.整数) 整型 等价于C中的有符号长整型(long) 与系统的最大整型一致(如32位机器上的整型是32位,64位机器上的整型是64位), 可以表示的整数范围在[-sys.maxint ...
- spring AOP 编程--AspectJ注解方式 (4)
1. AOP 简介 AOP(Aspect-Oriented Programming, 面向切面编程): 是一种新的方法论, 是对传统 OOP(Object-Oriented Programming, ...
- ReadyAPI 教程和示例(一)
原文:ReadyAPI 教程和示例(一) 声明:如果你想转载,请标明本篇博客的链接,请多多尊重原创,谢谢! 本篇使用的 ReadyAPI版本是2.5.0 通过下图你可以快速浏览一下主要的ReadyAP ...
- Activiti常用类介绍
为什么要使用工作流? 传统的设计在流程发生变化时的弊端: 1. 流程相关的属性和业务对象的属性,都放到了业务对象中. 2. 流程相关的逻辑和业务逻辑,都放到的业务逻辑中 常用类 ProcessEngi ...
- Atcoder arc085
C:HSI 期望模型,不想说. #include<cstdio> using namespace std; typedef long long ll; int main() { int n ...
- Idea安装Mevn
1.下载mevn安装包. 下载地址:http://maven.apache.org/ 点击Download 2.下面这两个选哪个都可以,取决于你用什么方式解压 3.把下载好的安装包解压到一个没有中文的 ...
- 漫说安全|智能的云WAF,开挂的Web防御
“漫说安全”是我们推出的一个新栏目,以简洁明了的形式展现高深晦涩的云安全. 今天我们要讲的是智能的云WAF到底有啥“本领”,答案就在漫画里^_^ 漫画看完后估计你还会有些小疑问,不要着急,安全君特意准 ...
- csp-s模拟测试55 联,赛,题题解
题面:https://www.cnblogs.com/Juve/articles/11610969.html 联: 用线段树维护区间和,要修改成1或0就线段树修改区间和 如果是异或,那么新的区间和就是 ...
- 0819NOIP模拟测试赛后总结
这次挂得很悲伤. T1.T3我都想到正解了…… 结果T1少看了个条件:20%保证ai互不相等.以为100%…… 然后挂到了20分,赛后加了个set不到1分钟就A掉了.. T2把分骗满跑路. T3sb线 ...