2013-03-01 91 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