首页 »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/
相关文章
读者评论
发表评论
|
|