2012-02-15 15 views
10

BHO nesnemdeki C# yöntemlerini sayfadaki Javascript'ten nasıl arayacağımı anlamaya çalışıyorum. Ben C++/ATL/nasıl yapılacağını çok sayıda sayfa bulunamadı gibi Com: Ben birlikte takip ve C# doğru uygulamaya çalışsa, amaJavascript'ten C# BHO yöntemlerini arama

Browser Helper Objects and Scripts Options

Calling BHO method from Javascript?

Yapamam Muhtemelen tam olarak anlamadığım bazı açık COM sorunları nedeniyle çalışmasını sağlayın.

C# 4.0 kullanıyorum. İşte

kodunun ilgili kısımları şunlardır:

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

cevap

21

o, kısa, basit ve güzeldir çünkü cevabını bilmek gerektiğini ben kendi soruya cevap istemem ama gerçekten topluluk gibi hissediyorum C# 4.0 ve SO ile bu sorunu çok insan görünüyor.

doğru tarayıcı yardımcı nesnesi maruz emin olun:

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

Ve siz uzantıları için bir tanım gerekir: Sen javascript içinde tarayıcı yardımcı nesnesi böylece erişebilir

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

:

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

ya da sadece

İşte bu kadar. Kafanı duvara karşı vurmayı bırak ve kutla! Eğer özelliğini ekledikten sonra, i) insanlar kişi için bilgi almak isteyen ve değil çünkü

+6

COM başvuruları serbest bırakmak için emin olmak gerekir kim cevapladı, ii) Gönderdiğiniz bir sorun var ve bunu cevaplamak mümkün üzerinde çalıştığınız anlamına gelir .. Bu 'cidden iyi bir şey .. tebrikler .... – Tirumudi

+1

Merhaba sabit nokta. Tam çalışan bir prototip yazabilir misiniz? Tam olarak bunu yeniden denedim ve window.myExtension 'undefined' kalıyor Bu sorumu tam kaynağımla yükledim [here] (http://stackoverflow.com/questions/15068872/calling-c-sharp-bho-methods- from-javascript-hala-çalışmayan) –

+0

Benim için bu benim sayfada bazı javascript yükler yüklenmez başarısız olur - herhangi bir dış komut dosyası başvurusu olmadan sayfalar, bir dış komut dosyası başvurusu olur olmaz, başarısız olur. Ayrıca garip, başarısız başladığında, daha önce çalıştığı sayfalarda başarısız olmaya devam ediyor. –

0

Ayrıca, .. Kendi soruya cevap için pişman olmayın pencere ve windowEx

İlgili konular