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

摘要:
32位ActiveX控件不能在64位IE上使用。6、综上所述,“.Net魔法厅:历史上最完整的ActiveX开发教程”系列终于整理完毕,标题引人注目。我希望这个系列的内容不会让大家失望。

一、前言                          

  经过上几篇的学习,现在我们已经掌握了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 FilesMicrosoft.NETPrimary Interop AssembliesMicrosoft.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位的)

六、总结

  《.Net魔法堂:史上最全的ActiveX开发教程》系列总算整理完了,起个博眼球的标题,希望系列的内容不会让大家失望啦。谢谢收看,哈哈!

  尊重原创,转载请注明来自:http://www.cnblogs.com/fsjohnhuang/p/3823687.html ^_^肥仔John

免责声明:文章转载自《.Net魔法堂:史上最全的ActiveX开发教程——ActiveX与JS间交互篇》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇如何简单去掉dede后台的验证码 dedecms5.7 验证码怎么去掉五. python数据转换下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

kindeditor在线编辑器的使用心得

1、如何声明引用? <!DOCTYPEhtml> <html> <head> <metacharset="utf-8"/> <title>kindeditor在线编辑器的使用心得</title> <!--添加kindeditor的引用--> <scr...

WPF开发进阶

前一篇 简单的介绍了Fody/PropertyChanged的使用方法, 这一篇,我们详细介绍它的一些比较重要的特性和规则 1. Attributes 通过在类或属性上标记这些特性,可以在编译代码时,注入特定的功能 ImplementPropertyChangedAttribute 为类标记此特性,可以实现INotifyPropertyChanged接口...

js判断当前是ios还是android

1.  判断是ios还是android let u = navigator.userAgent, let isAndroid = u.indexOf('Android') > -1 || u.indexOf('Linux') > -1; //g let isIOS = !!u.match(/(i[^;]+;( U;)? CPU.+Mac OS...

如何用javac 和java 编译运行整个Java工程

转自:http://blog.csdn.net/huagong_adu/article/details/6929817         前言:本文教你怎么用javac和java命令,以及如何利用脚本(shell或bat)方便处理,并用简单的实例展示这些用法。         IDE是把双刃剑,它可以什么都帮你做了,你只要敲几行代码,点几下鼠标,程序就跑起来...

Web Worker

写在前面 众所周知,JavaScript是单线程的,JS和UI更新共享同一个进程的部分原因是它们之间互访频繁,但由于共享同一个进程也就会造成js代码在运行的时候用户点击界面元素而没有任何响应这样的情况,这么糟糕的用户体验HTML5怎么会不修订了,这样Web Worker诞生了。 简介 Web Worker进程加载的js运行的时候不仅不会影响浏览器UI,而且...

js Base64与字符串互转

1、base64加密 在页面中引入base64.js文件,调用方法为: <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>base64加密</title> <script type="text/jav...