C#开发ActiveX控件

 

ActiveX 是一个开放的集成平台,为开发人员、用户和 Web生产商提供了一个快速而简便的在 Internet 和 Intranet 创建程序集成和内容的方法。 使用ActiveX, 可轻松方便的在 Web页中插入 多媒体效果、 交互式对象、以及复杂程序,创建用户体验相当的高质量多媒体 CD-ROM 。

简单的说,用activeX和js差不多,但是有些是js无法实现的,这个时候就可以考虑一下activeX,一般要求是在客户端执行的程序,比如对本机的串口操作等,下面来简单介绍下如何用C#自己开发一个activeX组件,并在web中应用

更改“项目属性-应用程序-程序集信息”设置,勾选“使程序集 COM 可见”:

更改“项目属性-生成”设置,勾选“为 COM 互操作 注册”

修改AssemblyInfo.cs文件,添加[assembly: AllowPartiallyTrustedCallers()]项(需要引用System.Security名称空间):

using System.Runtime.InteropServices;

using System.Security;

// 有关程序集的常规信息通过下列属性集

// 控制。更改这些属性值可修改

// 与程序集关联的信息。

[assembly: AssemblyTitle("ActivexDemo")]

[assembly: AssemblyDescription("")]

[assembly: AssemblyConfiguration("")]

[assembly: AssemblyCompany("微软中国")]

[assembly: AssemblyProduct("ActivexDemo")]

[assembly: AssemblyCopyright("Copyright © 微软中国 2012")]

[assembly: AssemblyTrademark("")]

[assembly: AssemblyCulture("")]

// 将 ComVisible 设置为 false 使此程序集中的类型

// 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型,

// 则将该类型上的 ComVisible 属性设置为 true。

[assembly: ComVisible(true)]

// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID

[assembly: Guid("f5438267-5c1e-4c24-b2e0-c2f172e753a4")]

// 程序集的版本信息由下面四个值组成:

//

//     主版本

//      次版本

//      内部版本号

//      修订号

//

// 可以指定所有这些值,也可以使用“内部版本号”和“修订号”的默认值,

// 方法是按如下所示使用“*”:

// [assembly: AssemblyVersion("1.0.*")]

[assembly: AssemblyVersion("1.0.0.0")]

[assembly: AssemblyFileVersion("1.0.0.0")]

[assembly: AllowPartiallyTrustedCallers()]

添加一个Windows用户控件:

完成控件开发后,为了使该用户控件作为一个ActiveX控件进行使用,还需要做以下修改:
      首先,为控件类添加GUID,这个编号将用于B/S系统的客户端调用时使用(可以使用 工具-创建GUID 菜单创建一个GUID):

或者通过程序获得

MessageBox.Show(Guid.NewGuid().ToString());

为了提高程序的安全性,以便在客户端安装的时候在浏览器提高信任度,我们需要实现接口IObjectSafety

 
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);
    }
然后在代码中实现接口即可  
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;//Guid引用
namespace ActivexDemo
{
   
    [Guid("0b6ed426-9e67-4cf3-99da-8a346a98e5c6")]
    public partial class Uc : UserControl,IObjectSafety
    {
        public Uc()
        {
            InitializeComponent();
        } 
        #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
    }
}
这样ActiveX的基本设置完成了,这个时候我们就可以利用ActiveX实现自己需要的功能了,我们两个举个例子
一、              在页面中放置一个文本框和一个按钮,当点击按钮的时候,把ActiveX中的值传到页面的文本框中
二、              在ActiveX的控件中放置一个按钮,当触发按钮事件后,把ActiveX的值传到页面的文本框中
上面这两个例子其实就是想实现如何实现js调用ActiveX和ActiveX调用页面的Js的,现在我们写一下代码,先看看第一种情况,在ActiveX中我们写了一个GetStr方法,用来返回一个值,然后把这个值传到页面中
   public string GetStr()
    {
            return "这是从ActiveX传过来的值";
}
好了,现在我们需要新建一个安装文件
   

1、   新建一个安装项目

2、 在项目上点右键,【添加】->【项目输出】,选择上边的项目

如果有多个项目,可以选择需要安装的项目就可以了

点击项目,按下“F4”,设置属性

3、  生成项目 
会生成两个文件,一个exe文件和一个msi文件

然后把这两个文件拷到项目的lib文件夹下面

1、  新建一个页面,添加下面的代码

<object classid="clsid:0b6ed426-9e67-4cf3-99da-8a346a98e5c6" codebase="lib/setup.exe"

width="200" height="40" id="helloBossma">

</object>

然后在页面中添加javascript代码,按钮和文本框

 
<head runat="server">
    <title>无标题页</title>
    <script type="text/javascript">
       function passValue()
       {  
 document.getElementById("textValue").value=document.getElementById("helloBossma").GetStr();
       }
    </script>
</head>
<body>
    <object  classid="clsid:0b6ed426-9e67-4cf3-99da-8a346a98e5c6" codebase="lib/setup.exe"
        width="200" height="40" id="helloBossma">
    </object>
    <form id="form1" runat="server">
    <div>
        <input id="textValue" type="text" />
        <input id="Button1" type="button" value="传值" onclick="passValue()"/>
    </div>
    </form>
</body>
</html>
 

这个时候我们就可以打开浏览器浏览页面了

运行加载提示的加载项就可以了

这个时候我们点击按钮传值就可以把ActiveX中的值传过来了

接着看看如何用ActiveX调用Javascript

首先在ActiveX中写一个方法用来将页面的js函数传过来。

页面的js函数

window.onload=function()

{

document.getElementById("helloBossma").regJs(window,"show");

}

function show(str)

{

document.getElementById("text1").value=str;

}

ActiveX中我们需要添加引用

 
using mshtml;         private IHTMLWindow2 temphtml = null;
        private string functionstr = "";         public void RegJs(object win, string fuc)
        {
            temphtml = (IHTMLWindow2)win;
            if (temphtml != null && !string.IsNullOrEmpty(fuc))
            {
                functionstr = fuc;
            }
            else
            {
                temphtml = null;
                functionstr = "";
                MessageBox.Show("注册脚本失败!");
            }
        }
在控件中放置一个按钮,触发按钮的onclick事件,在事件中将值传给页面的js,从而完成赋值
    private void button1_Click(object sender, EventArgs e)
        {
            temphtml.execScript(functionstr + "('从activeX中传值到页面')", "JScript");  
        }
 

上面是activeX的两个简单应用,更多的东西可以自行研究下..

多思考,多创新,才是正道!

使用C#开发ActiveX控件 11的更多相关文章

  1. 使用C#开发ActiveX控件(新)

    前言 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序功能,以增强浏览器端的动态处理能力.通常ActiveX控件都是 ...

  2. 使用C#开发ActiveX控件(新) 转 http://www.cnblogs.com/yilin/p/csharp-activex.html

    前言 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序功能,以增强浏览器端的动态处理能力.通常ActiveX控件都是 ...

  3. 使用C#开发ActiveX控件

    使用C#开发ActiveX控件(新) 前言 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序功能,以增强浏览器端的动 ...

  4. 使用C#开发ActiveX控件[new]

    文章出处:http://www.cnblogs.com/yilin/p/csharp-activex.html 前言 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以 ...

  5. C#开发Activex控件(转载别人的只为再看时方便放在自己里边了)

    前言 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序功能, 以增强浏览器端的动态处理能力.通常ActiveX控件都 ...

  6. 用C#开发ActiveX控件,并使用web调用

    入职差不多两个月了,由学生慢慢向职场人做转变,也慢慢的积累知识,不断的更新自己.最近的一个项目里边,涉及到的一些问题,因为SDK提供的只是winform才能使用了,但是有需求咱们必须得完成啊,所以涉及 ...

  7. ATL开发 ActiveX控件的 inf文件模板

    ATL开发 ActiveX控件的 inf文件模板    

  8. [转]C#开发ActiveX控件,.NET开发OCX控件案例

    引自:百度   http://hi.baidu.com/yanzuoguang/blog/item/fe11974edf52873aaec3ab42.html 讲下什么是ActiveX控件,到底有什么 ...

  9. [转] 使用C#开发ActiveX控件

    双魂人生 原文 使用C#开发ActiveX控件 ActiveX 是一个开放的集成平台,为开发人员.用户和 Web生产商提供了一个快速而简便的在 Internet 和 Intranet 创建程序集成和内 ...

随机推荐

  1. Android的Touch系统简介(一

    一.Android touch事件的相关概念 用户的Touch事件被包装成MotionEvent 用户当前的touch事件主要类型有: ACTION_DOWN: 表示用户开始触摸. ACTION_MO ...

  2. 亲测 安装 mysql5.5 64位

    1.选择 customn 更改安装目录2.选择 develop 模式,默认,占用内存较小. server machine 中等内存 dedicate mysql server machine 专用服务 ...

  3. yii2 控制器里 action 大小写组合造成的路由问题

    yii1中, 若存在如下控制器 class BindController extends CController { public function actionGetMobilePhone () { ...

  4. jquery ajax 提交表单(file && input)

    用到的插件 jquery.js jquery.form.js[http://malsup.github.io/jquery.form.js] 提交页面 <form enctype="m ...

  5. Web api 文档以及测试工具配置

    第一步: 创建web api 在nuget 上搜索 webapitestclient (包含预发行版) 然后在 /Areas/HelpPage/Views/Help/Api.cshtml 末尾 添加 ...

  6. EasyUI-datagrid获取编辑行的数据

    可以在页面对datagrid的数据直接进行修改,然后提交到数据库,但是要求在提交前获取datagrid的所有行的数据.API提供了getData方法 最后这样写才搞定 var    arr=$(‘#d ...

  7. jquery属性选择器之 attr

    在温习jquery手册的时候,注意到这个,坐下记录. attr(name|properties|key,value|fn) 获取匹配的元素集合中的第一个元素的属性的值 或 设置每一个匹配的元素的一个或 ...

  8. Java序列化的机制和原理

    Java序列化的机制和原理 本文讲解了Java序列化的机制和原理.从文中你可以了解如何序列化一个对象,什么时候需要序列化以及Java序列化的算法. 有关Java对象的序列化和反序列化也算是Java基础 ...

  9. 【SQL Server】SQL与Excel的数据互通导入导出

    转载至:http://jingyan.baidu.com/article/73c3ce28c839b7e50243d950.html

  10. UIView -> image & 本地时间获取

    //UIView 转换为图片 UIGraphicsBeginImageContext(self.rootsView.bounds.size); [_rootsView.layer renderInCo ...