VS2008制作ActiveX,并打包为CAB(2)
来源:互联网 发布:大数据全洞察 编辑:程序博客网 时间:2024/05/16 07:19
上一节介绍了一个ActiveX的例子,后续的文章将针对这个例子进行扩充和说明。这篇文章将介绍C#如何在ActiveX控件中调用javascript的函数,这里参考网上的例子介绍两种方法,虽然代码不一样,但是殊途同归。而且都使用了mshtml。
1、方法一
(1)在VS项目中添加Com对象引用:Microsoft Html Object Library(mshtml.tlb)
(2)ActiveX中公开一个方法,传递window对象到ActiveX中
ActiveX中公开一个方法,接受传递进来的参数
/// <summary> /// 将window对象传递进来 /// </summary> /// <param name="obj">The obj.</param> public void SetHtml(object obj) { html = (mshtml.HTMLWindow2Class)obj; }
在页面中调用ActiveX的公开方法,传递当前window对象进去:
window.onload = function() { document.HelloBossma.SetHtml(this); };
(3)在ActiveX控件中添加一个按钮,当点击这个按钮时,触发页面中的javascript。
点击按钮的方法:
/// <summary> /// 调用页面Javascript /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button1_Click(object sender, EventArgs e) { html.execScript("CallByActiveX();", "javascript"); }
现在卸载掉原来的ActiveX控件,安装新的控件,打开页面,点击按钮,看到如下效果,说明成功。
调用javascript时还可以传递参数,这里不做演示了,自己可以试一下。
参考:http://www.cnblogs.com/liubiqu/articles/92632.html
2、方法二
(1)在VS项目中添加Com对象引用:Microsoft Html Object Library(mshtml.tlb)
和第一种方法相同。
(2)用c#实现两个COM类,IOleClientSite和IOleContainer
using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; namespace HelloBossma { [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(); } [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); } }
(3)在ActiveX中编写CallJavascript方法:
/// <summary> /// 调用Javascript /// </summary> /// <param name="Filenames">The filenames.</param> private void CallJavaScript(string param) { //反射获取当前的控件的ClientSite Type typeIOleObject = this.GetType().GetInterface("IOleObject", true); object oleClientSite = typeIOleObject.InvokeMember("GetClientSite", BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.Public, null, this, null); //获取Container IOleClientSite oleClientSite2 = oleClientSite as IOleClientSite; IOleContainer pObj; oleClientSite2.GetContainer(out pObj); //参数数组 object[] args = new object[1]; args[0] = param; //获取页面的Script集合 IHTMLDocument pDoc2 = (IHTMLDocument)pObj; object script = pDoc2.Script; try { //调用JavaScript方法OnScaned并传递参数,因为此方法可能并没有在页面中实现,所以要进行异常处理 script.GetType().InvokeMember("ShowNowTime", BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.Public, null, script, args); } catch { } }
点击按钮时的操作:
/// <summary> /// 调用Javascript /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button1_Click(object sender, EventArgs e) { CallJavaScript(this.label2.Text); }
(4)网页中的javascript
function ShowNowTime(nowtime) { alert("当前时间:" + nowtime); }
卸载原来的ActiveX控件,重新安装,实际效果:
参考:http://blog.csdn.net/sabty/archive/2009/05/10/4165342.aspx
这篇文档到这里就结束了
- VS2008制作ActiveX,并打包为CAB(2)
- VS2008制作ActiveX,并打包为CAB(1)
- VS2008制作ActiveX,并打包为CAB(3)
- VS2008制作ActiveX,并打包为CAB(4)
- vs2008 使用c#写Activex插件,并在website中使用加载,并将cab制作为数字签名
- vs2008 使用c#写Activex插件,并在website中使用加载,并将cab制作为数字签名
- VS2008 ActiveX IObjectSavety IExpress打包cab,发布
- VS2008 ACtivex 制作CAB带 Vcredist_x86.exe 方案
- ActiveX CAB文件打包
- 使用C#开发ActiveX控件,并打包cab应用于web
- ATL Activex 插件打包成cab并簽名
- ActiveX控件打包CAB文件
- 打包制作cab文件
- vs2008下面制作activex
- C#开发ActiveX控件及CAB打包
- 制作activex控件cab的方法
- 制作Cab包,签名发布ActiveX
- VS 2010 开发 ActiveX 制作 cab 包
- 重写 hashCode 方法
- stackless实现并行ping
- dwr的应用
- Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面
- 智能指针
- VS2008制作ActiveX,并打包为CAB(2)
- Android 的Margin和Padding属性以及支持的长度单位
- 异常处理,保证代码稳定的必经之步----小话c语言(12)
- java 泛型使用和不定参数函数定义
- Android Handler Message多线程实例
- C# WinForm 父窗体 子窗体 传值
- 【C趣味100题】【Code_00】【开篇言】
- 从生活角度学习c++
- 收藏 不显示删除回复显示所有回复显示星级回复显示得分回复 dev 控件中 gridControl1 控件的button列 事件中如何获取所在行的某列的值