2012-02-15 78 views
10

我想弄清楚如何在頁面中的Javascript中調用BHO對象中的C#方法。我發現瞭如何做到這一點在C++/ATL /多個網頁的COM如:從Javascript調用C#BHO方法

Browser Helper Objects and Scripts Options

Calling BHO method from Javascript?

我試圖跟着在C#中正確地實現它,但我不能讓它工作可能是由於我有一些我不完全瞭解的明顯的COM問題。

我正在使用C#4.0。

這裏是代碼的相關部分:

using SHDocVw; 
using mshtml; 
using System.Runtime.InteropServices; 

[ComVisible(true), 
Guid("300736C4-DCDA-4DB0-90AD-4510A12EBBC6"), 
ClassInterface(ClassInterfaceType.None), 
ProgId("My Extension")] 
public class BrowserHelperObject : IObjectWithSite 
{ 
    const int DISPATCH_PROPERTYPUT = 4; 
    const int FDEX_NAME_ENSURE = 2; 
    const uint LOCALE_USER_DEFAULT = 0x0400; 

    WebBrowser browser; 

    ... 
    public void OnDocumentComplete(dynamic frame, ref dynamic url) 
    { 
     ... 
     var window = browser.Document.parentWindow; 

     int pid = 0; 
     window.GetDispId("myExtension", FDEX_NAME_ENSURE, ref pid); 

     System.Runtime.InteropServices.ComTypes.DISPPARAMS dispParms = new System.Runtime.InteropServices.ComTypes.DISPPARAMS(); 
     dispParms.cArgs = 1; 
     dispParms.cNamedArgs = 0; 
     dispParms.rgvarg = ???; 
     dispParms.rgdispidNamedArgs = IntPtr.Zero; 
     System.Runtime.InteropServices.ComTypes.EXCEPINFO einfo = new System.Runtime.InteropServices.ComTypes.EXCEPINFO(); 
     window.Invoke(pid, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPUT, ref dispParms, this, ref einfo);    
     ... 
    } 

回答

21

我不想回答我的問題,但我真的覺得自己是社會所應該知道的答案,因爲它短,操作簡單,美觀與C#4.0和所以許多人似乎有這個問題。

確保您正確曝光的瀏覽器輔助對象:

[ComVisible(true), 
Guid("DA8EA345-02AE-434E-82E9-448E3DB7629E"), 
ClassInterface(ClassInterfaceType.None), ProgId("MyExtension"), 
ComDefaultInterface(typeof(IExtension))] 
public class BrowserHelperObject : IObjectWithSite, IExtension 
{ 
    ... 
    public int Foo(string s) { ... } 
    ... 
    public void OnDocumentComplete(dynamic frame, ref dynamic url) 
    { 
     ... 
     dynamic window = browser.Document.parentWindow; 
     IExpando windowEx = (IExpando)window; 
     windowEx.AddProperty("myExtension"); 
     window.myExtension = this; 
     ... 
    } 
    ... 
} 

而且你將需要爲你的擴展定義:

[ComVisible(true), 
Guid("4C1D2E51-018B-4A7C-8A07-618452573E42"), 
InterfaceType(ComInterfaceType.InterfaceIsDual)] 
public interface IExtension 
{ 
    [DispId(1)] 
    int Foo(string s); 
    ... 
} 

您可以在JavaScript訪問您的瀏覽器輔助對象這樣的:

var result = window.myExtension.Foo("bar"); 

或只是

var result = myExtension.Foo("bar"); 

就是這樣。別把你的頭撞在牆上,去慶祝!

+6

的COM引用不後悔回答自己的問題。因爲,我)人們尋找答案,而不是對人誰回答,ii)你有一個問題張貼和你能夠回答它意味着你已經在它上面..這真是一件好事..恭喜...... – Tirumudi 2012-08-03 08:10:12

+1

嗨定點。你能發佈一個完整的工作原型嗎?我試圖正確地repro這和我的window.myExtension仍然'undefined' 我發佈了這個問題與我的完整源代碼[here](http://stackoverflow.com/questions/15068872/calling-c-sharp-bho-methods- from-javascript-still-not-working) – 2013-02-25 15:08:11

+0

對於我來說,只要我在頁面中加載了一些javascript,在沒有任何外部腳本引用的頁面上就沒有問題,只要我有一個外部腳本引用失敗。同樣奇怪的是,一旦它開始失敗,它就會在之前的工作頁面上失敗。 – 2013-04-10 15:50:42

0

此外,您添加屬性後,您需要確保釋放窗口和windowEx