java bho,从JavaScript调用C#BHO方法

I'm trying to figure out how to call C# methods in my BHO object from Javascript within the page. I found numerous pages on how to do it in C++/ATL/Com such as:

I have tried to follow along and implement it correctly in C#, but I can't get it to work probably due to some obvious COM problems that I have which I don't fully understand.

I am using C# 4.0.

Here are the relevant parts of the code:

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);

...

}

解决方案

I hate to answer my own question, but I really feel like the community ought to know the answer because it is short, simple, and beautiful with C# 4.0 and SO many people seem to have this problem.

Make sure that you correctly expose the Browser Helper Object:

[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;

...

}

...

}

And you will need a definition for your extensions:

[ComVisible(true),

Guid("4C1D2E51-018B-4A7C-8A07-618452573E42"),

InterfaceType(ComInterfaceType.InterfaceIsDual)]

public interface IExtension

{

[DispId(1)]

int Foo(string s);

...

}

You can access your Browser Helper Object in javascript thus:

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

or just

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

That's it. Stop banging your head against the wall and go celebrate!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值