2013-03-01 121 views
0

随着.NET WebBrowser控件提供了一个的window.external对象VB6,我们可以这样做:在web浏览器托管的网页

WebBrowser1.ObjectForScripting = new a_class(); 

其中a_class被声明为[ComVisible(True)]

之后,a_class的实例可以在页面下以名称window.external访问javascript。

如何实现与VB6/VBA WebBrowser OCX控件相同?

显然没有直接的属性设置。

WebBrowser1.Document.parentWindowWebBrowser1.Document.parentWindow.external对象,既没有null(提供的页面加载),但在

运行时错误445
对象分配的东西,后者的结果实例没有按” t支持这一行动。

只是为了排除这种可能性,我做了我想通过implement the IObjectSafety interface类,但没有做任何事情(在IObjectSafety成员甚至不叫)。

我也试着用TypeLib Information检查现有的parentWindow.external对象。 ClassClassInfoFromObject因“不支持自动化或所需接口”而失败,InterfaceInfoFromObject将失败,并且“下标超出范围”。

回答

0

这在VB6中并不容易。您必须在WebBrowser控件的站点对象上实现IDocHostUIHandler接口,并从GetExternal方法返回IDispatch。该站点对象由VB6表单提供,因此您必须在其IUnknown上挂接QueryInterface才能在VB6的站点对象上提供(某些)IDocHostUIHandler的自定义实现。

这是一个实现我做了前一段时间的直接复制/粘贴:https://gist.github.com/wqweto/5065624

你需要VBOleGuids3类型库和一个位代码清理,使其编译为一个单独的项目。

+0

它似乎'VBOleGuids3'只有谷歌知道,因为你发布这个答案:)我从哪里可以得到它?此外,这将无法在VBA中工作,除非使用VB6预编译,因为没有VBControlExtender支持,对吧? – GSerg 2013-03-01 16:37:09

+0

我不敢在VBA中使用这段代码。对于typelib,请尝试http://www.vbaccelerator.com/typelib.htm - 也需要'threadapi.tlb'。 – wqw 2013-03-02 04:35:23