C#制作ActiveX浏览器插件.net
开发环境:VS2008
第一步 创建项目
新建一个项目,选择“Windows窗体控件库”,创建一个用户控件项目“ActiveXDemo”(注意,这里起名不能用中文,否则后面会出问题),里面有个用户控件类UserControl1.cs
在类中写上你自己需要的业务逻辑代码,保存
第二步 设置项目属性
在AssemblyInfo.cs里添加[assembly: AllowPartiallyTrustedCallers()],需要引用using System.Security;命名空间
设置项目属性,右键项目——属性

选择“应用程序”,点开“程序集信息”

勾选“使程序集COM可见”,点“确定”
然后选择“生成”,滚动拉倒底部,勾选“为COM互操作注册”

然后保存,重新编译项目,至此,此时的“ActiveXDemo.dll”就成了一个ActiveX控件
第三步 安装外部工具
安装外部工具“OLE/COM对象查看器”和“创建GUID”(已有这两款工具的可以忽略此步骤)

1.OLE/COM对象查看器
这款工具是用来查看ActiveX控件的,也就是验证你的项目有没有成为一个ActiveX控件
安装方法:点开VS顶部菜单栏“工具”——“外部工具”

然后,添加一个“OLE/COM对象查看器”,对应的命令程序一般放在C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\OleView.Exe

点击“应用”,“确定”,这就算是安装完成,再重新点开顶部的“工具”菜单看看,里面就有一项“OLE/COM对象查看器”
点击“OLE/COM对象查看器”,展开左侧的“.NET Category”

你会发现,这里面就有你刚刚创建的ActiveX控件

这就是OLE/COM对象查看器的作用
2.创建GUID
高版本的VS貌似都自带了这个工具,但是在有的低版本或者安装不完整比如Vs2008中不一定有这个工具,所以在没有的时候需要安装一下
安装方法同上,只不过命令程序的地址一般是C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools\guidgen.exe

此工具的用途在下面的步骤中会讲到
第四步 提高ActiveX插件的安全等级
IE怎么知道一个插件是脚本安全的?它是通过以下两个办法。
一是查询ActiveX组件是否实现了IObjectSafety接口,并且返回脚本安全;
二是查询ActiveX组件是否在注册表的Component Category Manager里表明自己实现了CATID_SafeForInitializing和CATID_SafeForScripting。
这里我们只说第一种实现IObjectSafety接口
首先,为控件类UserControl1添加一个GUID,这个编号将用于B/S系统的客户端调用时使用(可以使用 工具-创建GUID 菜单创建一个GUID):
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices; namespace ActiveXDemo
{
[Guid("BB725724-65D6-4e71-AA11-DEDFAFE9248F"), ProgId("ActiveXDemo.UserControl1"), ComVisible(true)]
public partial class UserControl1 : UserControl,IObjectSafety
{
注意,要引入System.Runtime.InteropServices;命名空间
其次,为了让ActiveX控件获得客户端的信任,控件类还需要实现一个名为“IObjectSafety”的接口,因此在项目中添加一个接口类IObjectSafety
直接将下列代码复制粘贴,不要作任何改动,尤其是GUID,都是固定的,不能改
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
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);
}
}
同样,需要引入System.Runtime.InteropServices;命名空间
接着,在控件类UserControl1中实现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 = ;
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
这些代码也是固定的,不能改动,直接复制粘贴就行了
第五步 制作成安装文件
在原项目解决方案中新建一个安装项目,在VS2008中,是这样操作的
新建项目——其他项目类型——安装和部署——安装项目

注意,这里下方“解决方案”这里要选择“添入解决方案”
然后,右键安装项目——添加——项目输出

将我们的项目ActiveXDemo设为主输出

点确定,然后在主输出文件上右键——属性
将Register属性设为vsdrpCOM

重新编译安装项目,打开安装项目所在目录

至此,ActiveX浏览器插件的安装包就制作好了,双击setup.exe文件或ActiveXDemoSetup.msi文件可以将浏览器插件安装到你的电脑
第六步 使用ActiveX插件
新建一个Web项目或者一个Html文件,在需要使用浏览器插件的页面上加入以下代码:
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>无标题页</title>
</head>
<body>
<object id="csharpActiveX" classid="clsid:BB725724-65D6-4e71-AA11-DEDFAFE9248F" width="100%" height="150"></object> <form id="form1" runat="server">
<div>
<input type='button' onclick='csharpActiveX.Test()' value='我是按钮'/>
</div>
</form>
</body>
其中,重点是object标签里的classid属性,属性里面的GUID对应的就是第四步中指定的GUID
直接使用object定义的id属性就可以调用UserControl1类中的方法,是不是很方便?
为了更方便直观的看出插件有没有正常加载,可以再加入一些检测代码,如下:
<body>
<object id="csharpActiveX" classid="clsid:BB725724-65D6-4e71-AA11-DEDFAFE9248F" width="100%" height="150"></object> <form id="form1" runat="server">
<div>
<input type='button' onclick='csharpActiveX.Test()' value='我是按钮'/>
</div>
</form>
</body>
<script type="text/javascript">
var objCard = document.getElementById("csharpActiveX"); if (objCard.object==null) {
alert("csharpActiveX插件未安装!");
}
else{
alert("已检测到csharpActiveX插件!");
}
</script>
</html>
然后,由于只有IE支持ActiveX浏览器插件,所以在IE浏览器中打开这个页面,看一下效果

这时,不放心的话,可以再检查咱们的ActiveX插件究竟有没有安装上
点开工具栏“工具”——“管理加载项”

可以看到其中有一项ActiveXDemo.UserControl1,这就是我们安装上去的浏览器插件

第七步 ActiveX插件调用页面Js
这里,主要需要引入一个程序集叫Microsoft.mshtml.dll,它在系统文件夹里C:\Program Files (x86)\Microsoft.NET\Primary Interop Assemblies
引入后,开始在插件项目里写上注册Js函数相关的代码,如下
private IHTMLWindow2 temphtml = null;
private string functionstr = ""; public void RegJs(object objWinJs, string funcJs)
{
temphtml = (IHTMLWindow2)objWinJs;
if (temphtml != null && !string.IsNullOrEmpty(funcJs))
{
functionstr = funcJs;
}
else
{
temphtml = null;
functionstr = "";
MessageBox.Show("注册ActiveX插件回调脚本失败");
}
}
以及,执行页面Js函数的代码
private void ShowResult(object s, EventArgs e)
{
try
{
//必须要阻塞线程一段时间,以免在交易超时的情况下,由于read太快导致读取不完整
System.Threading.Thread.Sleep();
string txt = serialPort.ReadExisting(); temphtml.execScript("var msgActiveX='" + txt+"';", "JScript");
temphtml.execScript(functionstr + "()", "JScript"); }
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString());
}
}
在这里,我向页面输出了一个msgActiveX变量,并调用了前面注册过的Js函数
然后,我们还需要在页面加载的时候,调用插件的注册JS函数方法,以及此Js函数定义
<script type="text/javascript">
Ext.onReady(
function() {
objCard.regJs(window, 'test');
}
);
function test() {
var str = msgActiveX.substring(5);
var objJson = eval('(' + str + ')');
alert(objJson.responseCode);
//alert("回调函数执行成功");
}
</script>
至此,恭喜你已成功掌握了制作ActiveX浏览器插件的技能~
C#制作ActiveX浏览器插件.net的更多相关文章
- vs2017 C# ActiveX浏览器插件 创建 发布 C# windows窗体控件库(.NET Framework)注意事项
vs2017需要安装插 插件下载地址:https://marketplace.visualstudio.com/items?itemName=VisualStudioProductTeam.Micro ...
- 如何制作chrome浏览器插件之一
方法如下: 1.创建一个单独的文件夹,比如说为百度贴吧开发一个插件,就叫TiebaAddion.之后在这个文件夹里创建一个名字为"manifest.json"的文件,在里面写上如下 ...
- C#制作ActiveX插件
首先新建项目--->类库,取名:ActiveXDemo 右键项目属性:应用属性==>程序集信息=>使程序集Com可见, 生成==>输出==>为com互操作注册 新建接口类 ...
- 浏览器插件-ActiveX
浏览器插件:B/S模式下通过在客户端浏览器安装插件调用外设或者处理特殊格式数据. 常用插件有身份证阅读器.sim卡阅读器.银行卡校验插件.手写板插件.小键盘插件: 处理表格数据的华表插件.图片合成插件 ...
- 基于MFC的ActiveX控件开发教程------------浏览器插件之ActiveX开发
浏览器插件之ActiveX开发(一) 一般的Web应用对于浏览器插件能不使用的建议尽量不使用,因为其涉及到安全问题以及影响用户安装(或自动下载注册安装)体验问题.在有特殊需求(如涉及数据安全的金融业务 ...
- Qt加载网页(加载浏览器插件)和制作托盘后台运行(南信大财务报账看号)
程序模块要添加QNetWork和QWebKit模块: nuistfinancevideo.h文件: #ifndef NUISTFINANCEVIDEO_H #define NUISTFINANCEVI ...
- Atitit.hybrid混合型应用 浏览器插件,控件的实现方式 浏览器运行本地程序的解决方案大的总结---提升用户体验and开发效率..
Atitit.hybrid混合型应用 浏览器插件,控件的实现方式 浏览器运行本地程序的解决方案大的总结---提升用户体验and开发效率.. 1. hybrid App 1 1.1. Hybrid Ap ...
- 用Javascript编写Chrome浏览器插件
原文:http://homepage.yesky.com/62/11206062.shtml 用Javascript编写Chrome浏览器插件 2010-04-12 07:30 来源:天极网软件频道 ...
- 在NPAPI开发火狐浏览器插件在NPAPI插件
1.插件是什么 插件是一种遵循一定规范的应用程序接口编写出来的程序.插件必须依附于一个宿主程序,为宿主程序提供增强功能.插件的种类有很多,这里主要讨论浏览器插件. IE下利用OLE和COM技术开发的浏 ...
随机推荐
- 六、Spring之DI的Bean的作用域
Spring提供“singleton”和“prototype”两种基本作用域,另外提供“request”.“session”.“global session”三种web作用域:Spring还允许用户定 ...
- MySql5.5以上版本设置主从结构的例子
为了实现读写分离,一般都需要先设置好mysql的主从结构,网上现有的mysql配置大都基于低版本,在5.5以上版本无法配置成功,所以参考了官方文档,写了这篇笔记. *主要参考Mysql 5.6的官方文 ...
- package和package-lock区别;dependencies和devDependencies区别
package和package-lock package.json: 主要用来定义项目中需要依赖的包 package-lock.json: 在 npm install时候生成一份文件,用以记录当前状态 ...
- [国家集训队2012]middle(陈立杰)
我是萌萌的传送门 我是另一个萌萌的传送门 脑残错误毁一下午…… 其实题解早就烂大街了,然而很久之前我只知道是二分答案+主席树却想不出来这俩玩意儿怎么一块儿用的……今天又翻了几篇题解才恍然大悟,是把权值 ...
- 004声明式服务调用Feign & 断路器Hystrix
1.POM配置 和普通Spring Boot工程相比,添加了Eureka Client.Feign.Hystrix依赖和Spring Cloud依赖管理 <dependencies> &l ...
- 学习C++从入门到精通的的十本最经典书籍
原文:http://blog.csdn.net/a_302/article/details/17558369 最近想学C++,找了一下网上推荐的书籍,转载过来给大家分享 转载自http://c.chi ...
- android之键盘转载
显示键盘: EditText editText.setFocusable(true); editText.setFocusableInTouchMode(true); editText.request ...
- Linux 虚拟机的计划维护
Azure 定期执行更新,以提高虚拟机的主机基础结构的可靠性.性能及安全性. 此类更新包括修补宿主环境(例如操作系统.虚拟机监控程序以及主机上部署的各种代理)中的软件组件.升级网络组件以及硬件解除授权 ...
- SQLServer 2008 新增T-SQL 简写语法
1.定义变量时可以直接赋值 DECLARE @Id int = 5 2.Insert 语句可以一次插入多行数据 INSERT INTO StateList VALUES(@Id, 'WA'), (@I ...
- SQL Server ->> Computed Column(计算列)
Computed Column(计算列)是自SQL Server 2005开始就有的特性.计算列的定义是一个表达式.表达式可以是非计算列,常量,函数间的组合.但是不可以是子查询. 计算列数据固化 默认 ...