用C#编写ActiveX控件(二)

C#编写ActiveX控件(二)

                            Homer

在我的上一篇blog中,已经实现了一个最基本的ActiveX控件。当然,我们编写的任务还没有完成。首先,我们先尝试实现和JS的交互能力。

我们在Demo中加入ShowMessage方法:

public void ShowMessage(string msg)
        {
            if(msg != null)
            {
                MessageBox.Show(msg);
            }
        }

我们重新编译。在重新访问页面之前,我们先来修改html代码:

<body bgcolor='#223344'>
<object id="helloworld"
   classid="clsid:9551B223-6188-4387-B293-C7D9D8173E3A" Width="184" Height="96"
>
</object>
<br>
<input type='button' onclick='helloworld.ShowMessage(“Hello World!”)' value='Click'>
</body>

现在,重新访问http://localhost/helloworld.htm,单击Click按钮,应该可以实现交互了。

但是结果却很遗憾,我们发现IE跳出了对话框,如图所示:


单击确定之后,我们发现JS报错。根据提示,我们判断可以通过修改IE的设置使控件运行。打开IE的 工具——〉Internet选项——〉安全——〉本地Intranet——〉自定义级别——〉对没有标记为安全的ActiveX控件进行初始化和运行,将其值设为启用。我们刷新页面,现在终于可以正确运行了。

当然,我们不能指望我们的客户和我们一样修改这个值。毕竟,一是操作麻烦,二是给电脑带来了很大的安全风险。在互联网上搜索之后,发现必须要实现IObjectSafety接口,把ActiveX控件标记为安全的ActiveX控件。在搜索MSDN之后,我找到了IObjectSafety接口的定义。这就好办了。首先我们自己用C#实现这个接口:

[Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064"),InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IObjectSafety
    {
        // methods
        void GetInterfacceSafyOptions(
            System.Int32 riid,
            out System.Int32 pdwSupportedOptions,
            out System.Int32 pdwEnabledOptions);
        void SetInterfaceSafetyOptions(
            System.Int32 riid,
            System.Int32 dwOptionsSetMask,
            System.Int32 dwEnabledOptions);        
    }

注意,这个GUID是不能改的。然后,我们在Demo类里面实现这个接口。增加一下代码:

IObjectSafety 成员#region IObjectSafety 成员

        public void GetInterfacceSafyOptions(Int32 riid, out Int32 pdwSupportedOptions, out Int32 pdwEnabledOptions)
        {
            // TODO:  添加 WebCamControl.GetInterfacceSafyOptions 实现
            pdwSupportedOptions = 1;
            pdwEnabledOptions = 2;
        }

        public void SetInterfaceSafetyOptions(Int32 riid, Int32 dwOptionsSetMask, Int32 dwEnabledOptions)
        {
            // TODO:  添加 WebCamControl.SetInterfaceSafetyOptions 实现            
        }

        #endregion

重新编译,然后将IE里面的设置改回来。现在,我们发现,和JS的交互已经没有问题了。

这样,一个最基本的ActiveX控件已经写好了。你可以在这个控件的基础上增加任何你需要的功能。到这里,编写控件的任务已经完成了,我们的下一个目标就是发布它。

(0)

相关推荐

  • 使用C#开发ActiveX控件

    最近弄了一个在Qt中使用C#控件的功能,使用的方法是通过C#生产ActiveX控件,在Qt中使用该ActiveX控件.本文这里简单的介绍一下如何用C#生成ActiveX控件. 1. 建立WinForm的UserControl工程,在控件的属性页中选择"使程序集com可见" 分配Guid,在控件上加上GuidAttribute,这儿定义的Guid就是你的ActiveX控件的GUID了 2. 编译运行,编译运行(需要管理员权限)后可以通过系统的用户控件测试容器简单的测试该控件, 3. 发布

  • 使用VS2010 C#开发ActiveX控件(上)

    要开发Web版的读卡程序,大体思路如下: 1.       使用C#对原始的Dll进行封装,这里要封装两部分内容,一部分是串口通信的功能,一部分是对卡读写的功能. 2.       开发ActiveX控件调用封装后的Dll,使用串口通信来对卡进行读写. 3.       打包并发布ActiveX控件. 4.  使用ActiveX控件. 思路1中封装代码有2个类SerialInterfaceHelper,串口通信的帮助类,MifareOneHelper,M1卡的读写帮助类,我们放在了项目CardR

  • 用C#编写ActiveX控件(三)

    在前面我们已经完成了ActiveX控件的开发,接下来的就是发布它了. 首先,我们建立一个windows安装项目,并将ActiveX控件的主输出添加到项目输出中.然后,改动ActiveX控件的主输出文件,将其Register属性改为vsdrpCOM.如图: 下一步,我们改动项目属性,将引导程序更改为 Web引导程序.很遗憾的是,在 Web引导程序设置 中的安装文件夹URL中必须使用绝对路径,不能使用相对路径.这意味着生成安装程序的时候就必须确定路径,不是很方便.在示例中,我使用了localhost

  • 使用VS2010 C#开发ActiveX控件(下),完整代码打包下载

    其实如果我们不进行设置,只是修改了代码,运行程序以后,其出错界面如下图1所示: 图1 抛出异常如下: ************** Exception Text ************** System.MethodAccessException: Attempt by security transparent method 'Rare.Card.Libary.Controls. ReadCardControl.btnRead_Click(System.Object, System.Event

  • 用C#编写ActiveX控件(一)

    用C#编写ActiveX控件(一) 前些日子做一个Web项目,必须自己编写一个ActiveX控件.如今的ActiveX控件大多是使用VB/C++来开发的,而我对他们并不熟悉,因此考虑使用熟悉的C#编写ActiveX控件. 首先,建立一个WinForm控件项目HelloWorld,并拖入一个Label控件,文字设为HelloWorld,如图: UserControl1.cs内容如下: using System; using System.Collections; using System.Comp

  • 用C#编写ActiveX控件(二)

    用C#编写ActiveX控件(二)                             Homer 在我的上一篇blog中,已经实现了一个最基本的ActiveX控件.当然,我们编写的任务还没有完成.首先,我们先尝试实现和JS的交互能力. 我们在Demo中加入ShowMessage方法: public void ShowMessage(string msg)         {             if(msg != null)             {                 

  • DLL+ ActiveX控件+WEB页面调用例子

    一. 概述 因项目需要,开始学习并研究VC.DLL及ActiveX控件,网上资料找了很多,但没一个可用的或者说没一个例子可理解并运行的.没办法,自己研究吧.功夫不负有心人,终有小成了,呵呵,现在把自己学习总结了一下,献给需要的人. DLL(动态链接库): 分WIN32 DLL和MFC DLL ActiveX:分ATL控件和MFC控件两类(也是一个DLL) WEB:JAVASCRIPT 调用-> ActiveX调用-> DLL 完成加法运算并返回值,在页面上显示. 二.开发(VS2008) 1.

  • 激活 ActiveX 控件

    激活 ActiveX 控件 发布日期: 2006-3-29 | 更新日期: 2006-3-29 Internet 开发索引 用户不能与 APPLET.EMBED 或 OBJECT 元素加载的 Microsoft ActiveX 控件直接交互.用户激活这些控件的用户界面后才可以与这些控件交互.本文介绍 Microsoft Internet Explorer 如何处理 ActiveX 控件,显示如何加载 ActiveX 控件才能激活它们的界面,还描述这种行为对辅助工具和宿主 WebBrowser 控

  • ActiveX控件的使用-js实现打印超市小票功能代码详解

    ·应客户的需求= = ,要在网页端实现打印小票的功能 ·先来一张打印出的小票效果图(合计明显不对,因为有修改订单功能,请各位忽略) 用什么方法实现呢: 我想应该是有三种吧 1.用第三方的浏览器控件(这个好似比较方便,我的老师也是这样建议我)向大家推荐一个 Lodop打印控件 2.用CSS写好模板,然后直接用页面打印的方法(应该是这样吧) 以上两种还没有尝试,这两天陆续尝试) 3.用微软自己的ActiveX控件(ActiveX控件可以实现调用本地的文件等操作(之前试过调用cmd,实现shutdow

  • 基于MVC5和Bootstrap的jQuery TreeView树形控件(二)之数据支持json字符串、list集合

    在上篇给大家介绍了基于MVC5和Bootstrap的jQuery TreeView树形控件(一)之数据支持json字符串.list集合. 这种方式其实还是利用list集合的方式传给前台,只不过在前台做了一些小小的变化,而控制器代码也进行了部分的优化,值的一提的是:没用的ajax前后台交互舍弃掉了. 控制器代码如下: //实例化公共静态字典表集合 public static List<TC_DictionaryInfo> DInfo = new List<TC_DictionaryInfo

  • js之ActiveX控件使用说明 new ActiveXObject()

    什么是 ActiveX 控件? ActiveX 控件广泛用于 Internet.它们可以通过提供视频.动画内容等来增加浏览的乐趣.不过,这些程序可能出问题或者向您提供不需要的内容.在某些情况下,这些程序可被用来以您不允许的方式从计算机收集信息.破坏您的计算机上的数据.在未经您同意的情况下在您的计算机上安装软件或者允许他人远程控制您的计算机.考虑到这些风险,您应该在完全信任发行商的情况下才安装这些程序. 当 Windows 阻止 ActiveX 控件的安装时,您应该做什么? 您可能不应该安装该 A

  • EXTJS内使用ACTIVEX控件引起崩溃问题的解决方法

    问题 在本人目前的项目中,前端部分完全使用EXTJS基于"One-Page"理念搭建.除了一个HTML作为基本容器外,就全是JS文件了(页面是由JS文件实现的).当用户切换页面时候,我们通过析构上一个页面对象,然后创建新页面对象并展现在HTML中.基于这种架构,我们还引入了一个ActiveX控件,用于展现报表.这一引入,问题就出来了:只要是访问有报表控件存在的页面,用户切换2次页面,IE就会崩溃(FF无此问题),百试不爽. 原因 因为系统设计时考虑到了资源释放,专门处理过析构部分,而且

随机推荐