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);
...
}
Function Calling: A function call is an important part of the C programming language. It is called inside a program whenever it is required to call a function. It is only called by its name in the main() function of a program. We can pass the parameters to a function calling in the main() function.
Just declare the C function extern "C" (in your C++ code) and call it (from your C or C++ code). For example: // C++ code. extern "C" void f(int); // one way.
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!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With