在WebBrowser托管的页面中为window.external提供VB6对象

时间:2013-03-01 14:51:58

标签: javascript vba vb6 webbrowser-control window.external

使用.NET WebBrowser控件,我们可以:

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
  对象不支持此操作。

为了排除这一点,我创建了我要通过implement the IObjectSafety interface的课程,但这没有做任何事情(IObjectSafety成员甚至没有被调用)。

我还尝试使用TypeLib信息检查现有的parentWindow.external对象。 ClassClassInfoFromObject失败并显示“不支持自动化或必需的界面”,InterfaceInfoFromObject因“下标超出范围”而失败。

1 个答案:

答案 0 :(得分:0)

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

以下是我之前做过的实现的直接复制/粘贴:https://gist.github.com/wqweto/5065624

您需要VBOleGuids3 typelib和一些代码清理才能将其编译为单独的项目。