.Net魔法堂:史上最全的ActiveX开发教程——ActiveX与JS间交互篇

一、前言                          

  经过上几篇的学习,现在我们已经掌握了ActiveX的整个开发过程,但要发挥ActiveX的真正威力,必须依靠JS。下面一起来学习吧!

 

二、JS调用ActiveX方法                  

  只需在UserControl子类中(即自定义的ActiveX控件中),编写公共方法即可。

  C#

[Guid("0203DABD-51B8-4E8E-A1EB-156950EE1668")]
public partial class Uploader : UserControl, IObjectSafety
{
    public Uploader(){
      InitializeComponent();
  }

    // 被JS调用的ActiveX方法
    public void SayHi(msg){
        MessageBox.show(msg);
    }
}

 html

// 注意:object必须要写成<object></object>才能通过document.getElementById来获取
<object classid="clsid:xxxxxxxxxx" id="ax"></object>
<script type="text/javascript">
  document.getElementById('ax').SayHi('Test');// 调用ActiveX方法
</script>

三、ActiveX调用JS方法                      

  1. 引入`Microsoft.mshtml`程序集,该程序集位于`C:\Program Files\Microsoft.NET\Primary Interop Assemblies\Microsoft.mshtml.dll`
  2. 实现COM类`IOleClientSite`

  C#

[ComImport,
 Guid("00000118-0000-0000-C000-000000000046"),
 InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IOleClientSite
 {
    void SaveObject();
    void GetMoniker(uint dwAssign, uint dwWhichMoniker, object ppmk);
    void GetContainer(out IOleContainer ppContainer);
    void ShowObject();
    void OnShowWindow(bool fShow);
    void RequestNewObjectLayout();
 }

  3. 实现COM类`IOleContainer`

  C#

[ComImport,
 Guid("0000011B-0000-0000-C000-000000000046"),
 InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
public interface IOleContainer
 {
    void EnumObjects([In, MarshalAs(UnmanagedType.U4)] int grfFlags,
     [Out, MarshalAs(UnmanagedType.LPArray)] object[] ppenum);
    void ParseDisplayName([In, MarshalAs(UnmanagedType.Interface)] object pbc,
     [In, MarshalAs(UnmanagedType.BStr)] string pszDisplayName,
     [Out, MarshalAs(UnmanagedType.LPArray)] int[] pchEaten,
     [Out, MarshalAs(UnmanagedType.LPArray)] object[] ppmkOut);
    void LockContainer([In, MarshalAs(UnmanagedType.I4)] int fLock);
 }

  4. 在用户控件中调用JS方法
在MyUserControl.cs中

  C#

#region 调用js函数
        private Type typeIOleObject = null;
        private IOleClientSite oleClientSite = null;
        private IOleContainer pObj = null;

        /// <summary>
        /// 调用JS函数
        /// </summary>
        /// <param name="fnName">js函数名</param>
        /// <param name="args">入参</param>
        protected void CallJS(string fnName, params object[] args)
        {
            if (typeIOleObject == null)
            {
                typeIOleObject = this.GetType().GetInterface("IOleObject", true);
                object tmpOldClientSite = typeIOleObject.InvokeMember("GetClientSite",
                 BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.Public,
                null,
                this,
                null);

                oleClientSite = tmpOldClientSite as IOleClientSite;
                oleClientSite.GetContainer(out pObj);
            }

            //获取页面的Script集合
            IHTMLDocument pDoc2 = (IHTMLDocument)pObj;
            object script = pDoc2.Script;

            try
            {
                //调用JavaScript方法OnScaned并传递参数,因为此方法可能并没有在页面中实现,所以要进行异常处理
                script.GetType().InvokeMember(fnName,
                BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.Public,
               null,
                script,
                args);
            }
            catch { }
        }
        #endregion

五、踩过的坑                          

  1. 若在IE9下无法加载ActiveX控件

   检查是否为64位的IE9。32位的ActiveX控件不能在64位的IE上使用。(通过“任务管理器”查看进程名称,若为浏览器进程名称后跟32就是32位的)

时间: 2024-09-16 13:30:08

.Net魔法堂:史上最全的ActiveX开发教程——ActiveX与JS间交互篇的相关文章

2016电脑组装教程 史上最全自己组装电脑教程

  DIY电脑一直都是电脑爱好者非常喜欢的,电脑组装通常包括电脑硬件的选择,DIY硬件组装以及操作系统安装三个部分.对于电脑爱好者来说,通过自己动手DIY组装电脑,不仅可以更为深刻的认识硬件,了解电脑主机内部结构,还能够学习到安装系统等知识,从中可以带来很多乐趣. 2015电脑组装教程:史上最全自己组装电脑教程 本次电脑组装教程主要包含三个部分,包括电脑配置清单.电脑硬件认识以及电脑组装教程.此前,介绍过的几次组装电脑教程都是不是很详细,这次的装机教程堪称史上最全的,步骤上会介绍的非常细,对于新

.Net魔法堂:史上最全的ActiveX开发教程——开发篇

一.前言   在设计某移动内部自动化运维平台时,经综合考虑终端机性能和功能需求等因素后,决定采用B/S模式,并且浏览器通过ActiveX组件实现与服务器 Agent作P2P的通讯.好处,整个平台以网页形式存在,界面渲染性能高于桌面应用(终端机性能其低):通过ActiveX组件与各服务器Agent进 行P2P通讯,不对Web服务器造成压力.风险,当用ActiveX传输上百兆的文件时,会对浏览器造成哪些影响:团队中没有类似解决方案的经验供借鉴. 解决方法:前期对主要功能进行快速原型设计.开发.验证和

.Net魔法堂:史上最全的ActiveX开发教程——发布篇

一. 前言    接着上一篇<.Net魔法堂:史上最全的ActiveX开发教程--开发篇>,本篇讲述如何发布我们的ActiveX.   二.废话少讲,马上看步骤!    1. 打包  C#开发的Activex不像`OCX`那样直接通过`regsvr32.exe`注册,而采用两种方式发布使其运行在浏览器上.  1. 离线安装:将控件类库打包成MSI安装包,然后在客户端安装. 1.1. 添加安装项目 1.2. 右键"添加"->"项目输出",选择Acti

.Net魔法堂:史上最全的ActiveX开发教程——部署篇

一.前言   接<.Net魔法堂:史上最全的ActiveX开发教程--发布篇>,后我们继续来部署吧!   二. 挽起衣袖来部署     ActiveX的部署其实就是客户端安装ActiveX组件,对未签名和已签名的ActiveX,分别有对应的部署方式.   1. 部署未签名的ActiveX 未签名的ActiveX控件不受浏览器端信任,默认是不被允许安装的 1. 将网站加入 **可信站点** 2. 在"可信站点"和"Internet"下的 **自定义级别**

史上最全网站降权原因解析

在互联网时代飞速发展的前景下加上昂贵的竞价费用让多数企业苦不堪言于是低成本投入的职业-seo就诞生了,从业人数也每年呈递增状态,然而互联网的垃圾信息也越来越多,于是搜索引擎为了更好的迎合用户体验也频繁的展开了各项算法调整.在这期间当然也有很多网站被降权甚至被K掉,至于什么原因,有很多从职朋友还不能彻底的找到问题的根源,下面笔者以个人多年经验为大家展开一下分享,希望能帮助你早日恢复网站排名. 直接进入正题: 一.空间问题 因为空间访问速度不稳定,有时慢有时打不开的情况,因这个被降权的案列也是很多的

史上最全Vim快捷键键位图(入门到进阶)

史上最全Vim快捷键键位图(入门到进阶) 转载自:菜鸟教程 菜鸟主页: http://www.runoob.com/ Vim键位图 http://www.runoob.com/w3cnote/all-vim-cheatsheat.html

史上最全加快新域名网址搜索引擎收录方法

上周笔者在a5发布了一篇<史上最全外链资源寻找方法>的文章获得了很多好评,今天笔者在以个人5年seo优化经验分享一篇关于加快新域名被搜索引擎收录的方法. 废话不多说我们直接进入正题,当然前提是自己网站出来刚刚加的产品内容和文章要是新颖原创的: 一.制造链轮 首先用一个自己之前已养起来的新浪博客,条件是在该博客里面发布任意文章能妙收就可以啦.把网站要做的关键词插入到博客文章里去,加上超链接,结尾处加上新域名的网址链接在博客里面.然后在编辑成一篇文章如:"今天看到在某某公司门口停了100

史上最全外链资源寻找方法

很久没来A5发布文章了,期间都在从事seo培训工作,今天笔者在闲暇之余为大家分享一篇<史上最全外链资源寻找方法>的文章. 外链资源寻找的方法是数不胜数,大家只需百度一下便可以看到N个,但是笔者今天想要分享的是集个人多年seo经验总结出来的希望大家在绿萝算法推出的今天,外链对网站权重提升变得微乎甚微的情况下用心去阅读,搜索引擎再变也抵不过你多方平台发布外链,多方制造高质量外链等. 下面我们直接进入正题:以上是20种外链寻找方法 1.最简单最直接domain:网址,这个可以基本看到对手所发外链信息

史上最全的Win8快捷键大全

  这里收集了一大堆 Win8 系统相关的键盘快捷键列表汇总供大家参考学习.当然,我并不建议大家像背书似的刻意去记住全部的快捷键.只须挑选一些自己常用的实用的,多尝试几次,体会到方便之处自然而然就能记住了,对于普通人的记忆力来说应该是毫无鸭梨的-相信在习惯之后不久你就会体会到键盘流使用电脑的各种畅快感,恨不得了解所有软件的热键了,呵呵-- 史上最全的Win8快捷键大全 下列的 Win8 快捷键列表汇总均收集自网络,未全部实测,也有可能有Win7时代的热键混迹其中,不管怎样,如有错漏,欢迎大家指正