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 = 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

这些代码也是固定的,不能改动,直接复制粘贴就行了

第五步 制作成安装文件

在原项目解决方案中新建一个安装项目,在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浏览器插件的技能~

时间: 2024-09-26 20:09:21

C#制作ActiveX浏览器插件.net的相关文章

基于MFC的ActiveX控件开发教程------------浏览器插件之ActiveX开发

一般的Web应用对于浏览器插件能不使用的建议尽量不使用,因为其涉及到安全问题以及影响用户安装(或自动下载注册安装)体验问题.在有特殊需求(如涉及数据安全的金融业务数据交互.需插件才能实现的与本地设备的交互等)的情况下可以酌情慎用. 浏览器插件总体可以划分为两大阵营,即IE支持的插件以及非IE支持的插件.本来在Netscape时代,对于浏览器插件是有公用的规范的(NPAPI),一开始所有浏览器都支持该规范,包括IE.后来出于商业原因,微软的IE不再支持NPAPI,改而自己开发了一套基于COM的Ac

Qt加载网页(加载浏览器插件)和制作托盘后台运行(南信大财务报账看号)

程序模块要添加QNetWork和QWebKit模块: nuistfinancevideo.h文件: #ifndef NUISTFINANCEVIDEO_H #define NUISTFINANCEVIDEO_H #include <QtGui/QtGui> #include <QtNetwork/QNetworkReply> #include <QtWebKit/QWebView> #include <QtWebKit/QWebElementCollection&

浏览器插件研究

很早就想开发浏览器插件,像谷歌浏览器插件太丰富,但要熟悉javesript,go语言. 一般的Web应用对于浏览器插件能不使用的建议尽量不使用,因为其涉及到安全问题以及影响用户安装(或自动下载注册安装)体验问题.在有特殊需求(如涉及数据安全的金融业务数据交互.需插件才能实现的与本地设备的交互等)的情况下可以酌情慎用. 浏览器插件总体可以划分为两大阵营,即IE支持的插件以及非IE支持的插件.本来在Netscape时代,对于浏览器插件是有公用的规范的(NPAPI),一开始所有浏览器都支持该规范,包括

Atitit.hybrid混合型应用 浏览器插件,控件的实现方式 浏览器运行本地程序的解决方案大的总结---提升用户体验and开发效率..

Atitit.hybrid混合型应用 浏览器插件,控件的实现方式 浏览器运行本地程序的解决方案大的总结---提升用户体验and开发效率.. 1. hybrid App 1 1.1. Hybrid App为什么会兴起编辑 1 1.2. 如何实现网页语言与程序语言的混合编辑 2 1.2.1. 多View混合型 2 1.2.2. 单View混合型 2 1.2.3. Web主体型 2 1.3. Hybrid App的瓶颈与未来编辑 3 2. Web App.Hybrid App.Native APP对比

浏览器插件

浏览器插件:B/S模式下通过在客户端浏览器安装插件调用外设或者处理特殊格式数据. (这里暂时只讨论IE插件,商用中用的多一些) 常用插件有身份证阅读器.sim卡阅读器.银行卡校验插件.手写板插件.小键盘插件: 处理表格数据的华表插件.图片合成插件.图片添加水印插件,发票打印插件: 1.插件原理 插件一般使用c/c++开发,通过插件中接口处理,返回一个js对象供页面调用处理: 本质上就是通过OCX封装了调用操作系统的接口,而这些接口又通过JS对象中方法直接暴露给给页面来调用: 要想知道具体提供了哪

浏览器插件-自动登录淘宝(二)

前言 关于案例 下一章 版本更新提示案例 一.前言 上章我们提到过开发一个插件所需要的步骤: 浏览器插件-自动登录淘宝(-) 并且还介绍了如何在页面上面注入脚本代码,并且成功的完成用户名和密码的自动输入功能. 本章将会以一些案例来介绍插件的一些新的开发技巧.案例将包括: 关于案例 涉及的技术点包括: 如何使用popup.html popup如何使用js 如何使用chrome  api 二.关于案例 任何一个成熟的产品都会有关于的标志,这是在法律的角度上面宣示自己拥有这个产品的所有权. 以下案例将

浏览器插件-自动登录淘宝(-)

浏览器插件的介绍 Chrome浏览器插件开发的准备工作 manifest.json配置介绍 页面如何注入scripts文件 下一章backgroup的应用 一. 浏览器插件的介绍 浏览器插件是一种遵循一定规范的应用程序接口编写出来的,是对其进行起一个补充作用的程序,如播放Flash文件,浏览器本身是没有这个功能的,所以要通过插件来达到播放的功能. 常用的浏览器插件有: Flash插件.RealPlayer插件.ActiveX插件.雅虎插件,百度,QQ, 搜狗,新浪,360网购,抢票工具等. 二.

在NPAPI开发火狐浏览器插件在NPAPI插件

1.插件是什么 插件是一种遵循一定规范的应用程序接口编写出来的程序.插件必须依附于一个宿主程序,为宿主程序提供增强功能.插件的种类有很多,这里主要讨论浏览器插件. IE下利用OLE和COM技术开发的浏览器插件称为ActiveX控件.一般以.ocx为扩展名.IE浏览器通过OLE标准与ActiveX控件之间进行交互,完成对现有功能的扩充. IE和OLE技术都是微软出的,所以如果在非IE浏览器下开发插件,就不能使用现有的COM技术标准.NPAPI技术提供了一种新的开发浏览器下插件的标准.浏览器和插件共

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

使用C#开发ActiveX控件 控件开发.制作CAB包.签名.部署 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序功能,以增强浏览器端的动态处理能力.通常ActiveX控件都是用C++或VB语言开发,本文介绍另一种方式,在.NET Framework平台上,使用C#语言开发ActiveX控件. 虽然本文通篇都在讲如何使用C#语言开发ActiveX控件,但我并不极力推荐使用这种技术,因为该技术存在明显的局限,即需