专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »DotNet » 调用javascript:在用c#开发的ActiveX中调用JavaScript思路方法 »正文

调用javascript:在用c#开发的ActiveX中调用JavaScript思路方法

来源: 发布时间:星期五, 2009年1月9日 浏览:24次 评论:0
  这段时间要写个ActiveXControl控件来控制扫描仪并在扫描完成的后将文件路径通知页面扫描过程是异步所以我不能利用ActiveXControl控件公开Scan思路方法来返回文件路径结合Name Ctrl订阅联系人状态思路我想如果可以用JavaScript来订阅ActiveX完成扫描“事件”我就可以在这个“事件”中把文件路径当作参数传递给页面了

  有关如何用c#开发ActiveXControl控件红马天下兄系列文章写非常不错我这里主要讲下如何在ActiveX中页面上JavaScript思路方法

  1.引用Microsoft.mshtml

  microsoft.mshtml路径是C:Program FilesMicrosoft.NETPrimary Interop AssembliesMicrosoft.mshtml.dll添加引用后在ActiveX对应类中编写:

  usingmshtml;

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

[ComImport,
Guid("00000118-0000-0000-C000-000000000046"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
publicerfaceIOleClientSite
{
voidSaveObject;
voidGetMoniker(udwAssign,udwWhichMoniker,objectppmk);
voidGetContainer(outIOleContainerppContainer);
voidShowObject;
voidOnShowWindow(boolfShow);
voidRequestNewObjectLayout;
}
[ComImport,
Guid("0000011B-0000-0000-C000-000000000046"),
InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
publicerfaceIOleContainer
{
voidEnumObjects([In,MarshalAs(UnmanagedType.U4)]grfFlags,
[Out,MarshalAs(UnmanagedType.LPArray)]objectppenum);
voidParseDisplayName([In,MarshalAs(UnmanagedType.Interface)]objectpbc,
[In,MarshalAs(UnmanagedType.BStr)]pszDisplayName,
[Out,MarshalAs(UnmanagedType.LPArray)]pchEaten,
[Out,MarshalAs(UnmanagedType.LPArray)]objectppmkOut);
voidLockContainer([In,MarshalAs(UnmanagedType.I4)]fLock);
}


  3.JavaScript思路方法

  在ActivexControl控件对应类中就可以编写如下CallJavaScript思路方法:

privatevoidCallJavaScript(Filenames)
{
TypetypeIOleObject=this.GetType.GetInterface("IOleObject",true);
objectoleClientSite=typeIOleObject.InvokeMember("GetClientSite",
BindingFlags.Instance|BindingFlags.InvokeMethod|BindingFlags.Public,
null,
this,
null);
IOleClientSiteoleClientSite2=oleClientSiteasIOleClientSite;
IOleContainerpObj;
oleClientSite2.GetContainer(outpObj);
//参数
objectargs=object[1];
args[0]=Filenames;
//获取页面Script集合
IHTMLDocumentpDoc2=(IHTMLDocument)pObj;
objectscript=pDoc2.Script;
try
{
//JavaScript思路方法OnScaned并传递参数此思路方法可能并没有在页面中实现所以要进行异常处理
script.GetType.InvokeMember("OnScaned",
BindingFlags.Instance|BindingFlags.InvokeMethod|BindingFlags.Public,
null,
script,
args);
}
catch{}
}


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

  在包含这个ActiveXControl控件页面中添加如下JavaScript思路方法:

<scripttype="text/javascript">
functionOnScaned(files)
{
(files)
{
//dosomething
}
}
</script>


  这样在ActiveXControl控件中CallJavaScript思路方法时最终就会到页面中OnScaned思路方法藉此实现了ActiveX“事件”机制

  在测试过程中发现些有趣事情不妨也和大家分享下:

  object元素结束:object元素只能以<object></object>方式结束而不能简单用<object/>来结束这样结束后果是object后边元素都无法在JavaScript思路方法中获取可能是浏览器还认为object元素没有结束吧

  参数类型:最初我想在c#中给JavaScript思路方法传递类型参数但当JavaScript思路方法执行时我发现JavaScript将该参数识别为“unknown”并且无法对其做任何处理所以最后只好作罢用传递以“|”分隔串代替

  小草这篇文章提供了更简单JavaScript思路方法只需要在化时传递页面window属性但我还没弄清楚如何给JavaScript传递参数

  http://xiaoshatian.cnblogs.com/

0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: