您的位置:首页 > 编程语言 > C#

Visual Studio 2008(c#)开发ActiveX控件及制作CAB包总结(2)

2011-05-27 15:52 441 查看
上一节介绍了一个ActiveX的例子,后续的文章将针对这个例子进行扩充和说明。这篇文章将介绍C#如何在ActiveX控件中调用javascript的函数,这里参考网上的例子介绍两种方法,虽然代码不一样,但是殊途同归。而且都使用了mshtml。

1、方法一

(1)在VS项目中添加Com对象引用:MicrosoftHtmlObjectLibrary(mshtml.tlb)







(2)ActiveX中公开一个方法,传递window对象到ActiveX中
ActiveX中公开一个方法,接受传递进来的参数

///<summary>
///将window对象传递进来
///</summary>
///<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。





点击按钮的方法:

///<summary>
///调用页面Javascript
///</summary>
///<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;
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
IOleContainerppContainer);
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>
///<paramname="Filenames">Thefilenames.</param>
private
void
CallJavaScript(
string
param)
{
//反射获取当前的控件的ClientSite
TypetypeIOleObject=
this
.GetType().GetInterface(
"IOleObject"
,
true
);
object
oleClientSite=typeIOleObject.InvokeMember(
"GetClientSite"
,
BindingFlags.Instance|BindingFlags.InvokeMethod|BindingFlags.Public,
null
,
this
,
null
);
//获取Container
IOleClientSiteoleClientSite2=oleClientSite
as
IOleClientSite;
IOleContainerpObj;
oleClientSite2.GetContainer(
out
pObj);
//参数数组
object
[]args=
new
object
[1];
args[0]=param;
//获取页面的Script集合
IHTMLDocumentpDoc2=(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>
///<paramname="sender"></param>
///<paramname="e"></param>
private
void
button1_Click(
object
sender,EventArgse)
{
CallJavaScript(
this
.label2.Text);
}
(4)网页中的javascript

function
ShowNowTime(nowtime){
alert(
"当前时间:"
+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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: