C# ActiveX控件中调用JavaScript方法

1.引用Microsoft.mshtml

Microsoft.mshtml的路径是C:/Program Files/Microsoft.NET/Primary Interop Assemblies/Microsoft.mshtml.dll,添加引用后在ActiveX对应类中编写:

using mshtml;


2.用c#实现两个COM类,IOleClientSite和IOleContainer


using System.Runtime.InteropServices;
[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.调用JavaScript方法

在Activex控件的对应类中就可以编写如下的CallJavaScript方法: 

private void CallJavaScript(string Filenames)
{
Type typeIOleObject = this.GetType().GetInterface("IOleObject", true);
object oleClientSite = typeIOleObject.InvokeMember("GetClientSite",
BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.Public,
null,
this,
null);

IOleClientSite oleClientSite2 = oleClientSite as IOleClientSite;
IOleContainer pObj;
oleClientSite2.GetContainer(out pObj);

//参数数组

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

//获取页面的Script集合

IHTMLDocument pDoc2 = (IHTMLDocument) pObj;
object script = pDoc2.Script;

try
{
//调用JavaScript方法OnScaned并传递参数,因为此方法可能并没有在页面中实现,所以要进行异常处理

script.GetType().InvokeMember("OnScaned",
BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.Public,
null,
script,
args);
}
catch { }
}


4.在页面中实现相应的JavaScript方法

在包含这个ActiveX控件的页面中添加如下的JavaScript方法:


<script type="text/javascript">
function OnScaned(files)
{
if (files)
{
//do something

}
}
</script>


这样,在ActiveX控件中调用CallJavaScript方法时,最终就会调用到页面中的OnScaned方法,藉此实现了ActiveX的“事件”机制。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值