上一节介绍了一个ActiveX的例子,后续的文章将针对这个例子进行扩充和说明。这篇文章将介绍C#如何在ActiveX控件中调用javascript的函数,这里参考网上的例子介绍两种方法,虽然代码不一样,但是殊途同归。而且都使用了mshtml。
1、方法一
(1)在VS项目中添加Com对象引用:MicrosoftHtmlObjectLibrary(mshtml.tlb)
(2)ActiveX中公开一个方法,传递window对象到ActiveX中
ActiveX中公开一个方法,接受传递进来的参数
///<paramname="obj">Theobj.</param> |
public void SetHtml( object obj) |
html=(mshtml.HTMLWindow2Class)obj; |
在页面中调用ActiveX的公开方法,传递当前window对象进去:
window.onload= function (){ |
document.HelloBossma.SetHtml( this ); |
(3)在ActiveX控件中添加一个按钮,当点击这个按钮时,触发页面中的javascript。
点击按钮的方法:
///<paramname="sender"></param> |
///<paramname="e"></param> |
private void button1_Click( object sender,EventArgse) |
html.execScript( "CallByActiveX();" , "javascript" ); |
现在卸载掉原来的ActiveX控件,安装新的控件,打开页面,点击按钮,看到如下效果,说明成功。
调用javascript时还可以传递参数,这里不做演示了,自己可以试一下。
参考:http://www.cnblogs.com/liubiqu/articles/92632.html
2、方法二
(1)在VS项目中添加Com对象引用:MicrosoftHtmlObjectLibrary(mshtml.tlb)
和第一种方法相同。
(2)用c#实现两个COM类,IOleClientSite和IOleContainer
using System.Collections.Generic; |
using System.Runtime.InteropServices; |
Guid( "00000118-0000-0000-C000-000000000046" ), |
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] |
public interface IOleClientSite |
void GetMoniker( uint dwAssign, uint dwWhichMoniker, object ppmk); |
void GetContainer( out IOleContainerppContainer); |
void OnShowWindow( bool fShow); |
void RequestNewObjectLayout(); |
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方法:
///<paramname="Filenames">Thefilenames.</param> |
private void CallJavaScript( string param) |
TypetypeIOleObject= this .GetType().GetInterface( "IOleObject" , true ); |
object oleClientSite=typeIOleObject.InvokeMember( "GetClientSite" , |
BindingFlags.Instance|BindingFlags.InvokeMethod|BindingFlags.Public, |
IOleClientSiteoleClientSite2=oleClientSite as IOleClientSite; |
oleClientSite2.GetContainer( out pObj); |
object []args= new object [1]; |
IHTMLDocumentpDoc2=(IHTMLDocument)pObj; |
object script=pDoc2.Script; |
//调用JavaScript方法OnScaned并传递参数,因为此方法可能并没有在页面中实现,所以要进行异常处理 |
script.GetType().InvokeMember( "ShowNowTime" ,BindingFlags.Instance|BindingFlags.InvokeMethod|BindingFlags.Public, |
点击按钮时的操作:
///<paramname="sender"></param> |
///<paramname="e"></param> |
private void button1_Click( object sender,EventArgse) |
CallJavaScript( this .label2.Text); |
(4)网页中的javascript
function ShowNowTime(nowtime){ |
卸载原来的ActiveX控件,重新安装,实际效果:
参考:http://blog.csdn.net/sabty/archive/2009/05/10/4165342.aspx
这篇文档到这里就结束了,关于这两个方法的使用,如果有问题,欢迎和我交流!
转自:http://blog.bossma.cn/dotnet/visual-studio-2008-csharp-activex-summary-2/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理