VS 2010 开发 ActiveX 交互篇二

ActiveX 控件中调用 JavaScript 方法

1. 添加接口 【IOleContainer】,代码如下

[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, [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);
}


2. 添加接口 【IOleClientSite】,代码如下

[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. 调用JS方法的代码如下

参数 functionName 为 JS 方法名称

参数 paras 是 String 类型,可以使用特定规则组合多个值

private void CallJavaScriptMethod(string functionName, string paras)
{
            BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.Public;

            Type typeIOleObject = this.GetType().GetInterface("IOleObject", true);
            object objClientSite = typeIOleObject.InvokeMember("GetClientSite", bindingFlags, null, this, null);

            IOleClientSite oleClientSite = objClientSite as IOleClientSite;
            IOleContainer oleContainer;
            oleClientSite.GetContainer(out oleContainer);

            object[] args = new object[1];
            args[0] = paras;

            IHTMLDocument htmlDocument = (IHTMLDocument)oleContainer;
            object script = htmlDocument.Script;

            try
            {
                script.GetType().InvokeMember(functionName, bindingFlags, null, script, args);
            }
            catch { }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值