簡體   English   中英

從Javascript調用C#BHO方法

[英]Calling C# BHO methods from Javascript

我試圖弄清楚如何在頁面內的Javascript中調用我的BHO對象中的C#方法。 我在C ++ / ATL / Com中找到了很多關於如何做的頁面,例如:

瀏覽器幫助程序對象和腳本選項

從Javascript調用BHO方法?

我試圖在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);            
        ...
    }

我討厭回答我自己的問題,但我真的覺得社區應該知道答案,因為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");

而已。 別再撞到牆上去慶祝吧!

此外,添加屬性后,您需要確保釋放窗口和windowEx的COM引用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM