从JavaScript调用C#BHO方法 [英] Calling C# BHO methods from Javascript

查看:845
本文介绍了从JavaScript调用C#BHO方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想弄清楚如何从Javascript在网页中调用C#方法在我的BHO对象。我发现了如何做到这一点在C ++ / ATL /通讯等众多页:

<一个href=\"http://groups.google.com/group/microsoft.public.inetsdk.programming.webbrowser_ctl/browse_thread/thread/afb353de46bae2f8?pli=1\">Browser帮助对象和脚本选项

从JavaScript调用的方法BHO?

我试图跟着,并在C#中正确实现它,但我不能让它工作,可能由于我有我不完全了解一些明显的COM问题。

我使用C#4.0。

下面是code的相关部分:

使用SHDOCVW;
使用MSHTML;
使用System.Runtime.InteropServices;[标记有ComVisible特性(真),
 GUID(300736C4-DCDA-4DB0-90AD-4510A12EBBC6),
 ClassInterface(ClassInterfaceType.None)
 的ProgId(我的扩展)]
公共类BrowserHelperObject:接口IObjectWithSite
{
    const int的DISPATCH_PROPERTYPUT = 4;
    const int的FDEX_NAME_ENSURE = 2;
    常量UINT LOCALE_USER_DEFAULT = 0x0400的时候;    web浏览器的浏览器;    ...
    公共无效OnDocumentComplete(动感相框,动态参考网址)
    {
        ...
        变种窗口= browser.Document.parentWindow;        INT PID = 0;
        window.GetDispId(myExtension,FDEX_NAME_ENSURE,PID给定);        System.Runtime.InteropServices.ComTypes.DISPPARAMS dispParms =新System.Runtime.InteropServices.ComTypes.DISPPARAMS();
        dispParms.cArgs = 1;
        dispParms.cNamedArgs = 0;
        dispParms.rgvarg = ???;
        dispParms.rgdispidNamedArgs = IntPtr.Zero;
        System.Runtime.InteropServices.ComTypes.EXCEPINFO einfo =新System.Runtime.InteropServices.ComTypes.EXCEPINFO();
        window.Invoke(PID,LOCALE_USER_DEFAULT,DISPATCH_PROPERTYPUT,裁判dispParms,对此,裁判einfo);
        ...
    }


解决方案

我不想回答我的问题,但我真的觉得自己是社区应该知道答案,因为它是短暂的,简单,美丽与C#4.0和因此,许多人似乎有这个问题。

请确保您正确地揭露浏览器辅助对象:

[标记有​​ComVisible特性(真),
 GUID(DA8EA345-02AE-434E-82E9-448E3DB7629E),
 ClassInterface(ClassInterfaceType.None)的ProgId(MyExtension),
 ComDefaultInterface(typeof运算(IExtension))]
公共类BrowserHelperObject:接口IObjectWithSite,IExtension
{
    ...
    公众诠释美孚(字符串s){...}
    ...
    公共无效OnDocumentComplete(动感相框,动态参考网址)
    {
        ...
        动态窗口= browser.Document.parentWindow;
        IExpando windowEx =(IExpando)窗口;
        windowEx.AddProperty(myExtension);
        window.myExtension =这一点;
        ...
    }
    ...
}

和您将需要为你的扩展定义:

[标记有​​ComVisible特性(真),
 GUID(4C1D2E51-018B-4A7C-8A07-618452573E42),
 InterfaceType(ComInterfaceType.InterfaceIsDual)
公共接口IExtension
{
    [DISPID(1)]
    INT美孚(字符串s);
    ...
}

您可以访问您的浏览器辅助对象在JavaScript这样的:

VAR的结果= window.myExtension.Foo(巴);

或只是

VAR的结果= myExtension.Foo(巴);

就是这样。别拿你的头靠在墙上,去庆祝吧!

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:

Browser Helper Objects and Scripts Options

Calling BHO method from Javascript?

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!

这篇关于从JavaScript调用C#BHO方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆