.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位的)

 

六、总结

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

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

如果您觉得本文的内容有趣就扫一下吧!捐赠互勉!


本文转自^_^肥仔John博客园博客,原文链接:http://www.cnblogs.com/fsjohnhuang/p/3823687.html,如需转载请自行联系原作者

相关文章
|
1月前
|
SQL 开发框架 数据可视化
企业应用开发中.NET EF常用哪种模式?
企业应用开发中.NET EF常用哪种模式?
|
2月前
|
开发框架 JavaScript 前端开发
5个.NET开源且强大的快速开发框架(帮助你提高生产效率)
5个.NET开源且强大的快速开发框架(帮助你提高生产效率)
|
4天前
|
开发框架 前端开发 JavaScript
采用C#.Net +JavaScript 开发的云LIS系统源码 二级医院应用案例有演示
技术架构:Asp.NET CORE 3.1 MVC + SQLserver + Redis等 开发语言:C# 6.0、JavaScript 前端框架:JQuery、EasyUI、Bootstrap 后端框架:MVC、SQLSugar等 数 据 库:SQLserver 2012
|
29天前
|
数据安全/隐私保护 Windows
.net三层架构开发步骤
.net三层架构开发步骤
9 0
|
29天前
深入.net平台的分层开发
深入.net平台的分层开发
47 0
|
1月前
|
小程序 JavaScript 前端开发
【微信小程序】--WXML & WXSS & JS 逻辑交互介绍(四)
【微信小程序】--WXML & WXSS & JS 逻辑交互介绍(四)
|
1月前
|
JavaScript 前端开发
javascript中的交互效果
javascript中的交互效果
|
2月前
|
前端开发 JavaScript
前端 JavaScript 与 HTML 怎么实现交互
前端 JavaScript 与 HTML 怎么实现交互
|
2月前
|
开发框架 前端开发 .NET
福利来袭,.NET Core开发5大案例,30w字PDF文档大放送!!!
为了便于大家查找,特将之前开发的.Net Core相关的五大案例整理成文,共计440页,32w字,免费提供给大家,文章底部有PDF下载链接。
32 1
福利来袭,.NET Core开发5大案例,30w字PDF文档大放送!!!
|
2月前
|
Rust 前端开发 JavaScript
Rust与JavaScript的跨语言交互:探索与实践
本文旨在探讨Rust与JavaScript之间的跨语言交互方法。我们将深入了解WebAssembly(Wasm)的角色,以及它如何使得Rust与JavaScript能够在Web应用中和谐共处。此外,我们还将介绍Rust与JavaScript的集成方式,包括Rust编译到Wasm、使用wasm-bindgen进行Rust与JavaScript的绑定,并通过实际案例展示如何实现两者之间的交互。