2012-02-15 14 views
10

से सी # बीएचओ विधियों को कॉल करना मैं पृष्ठ के भीतर जावास्क्रिप्ट से अपने बीएचओ ऑब्जेक्ट में सी # विधियों को कॉल करने का तरीका जानने का प्रयास कर रहा हूं। मैं कैसे C++/ATL/यह करने के लिए पर कई पृष्ठों पाया कॉम जैसे:जावास्क्रिप्ट

Browser Helper Objects and Scripts Options

Calling BHO method from Javascript?

मैं आगे बढ़ने के और सी # में सही ढंग से इसे लागू करने की कोशिश की है, लेकिन मैं नहीं कर सकता शायद कुछ स्पष्ट COM समस्याओं के कारण काम करने के लिए इसे प्राप्त करें जो मेरे पास है जो मैं पूरी तरह समझ नहीं पा रहा हूं।

मैं सी # 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);    
     ... 
    } 

उत्तर

21

मैं जवाब पता है क्योंकि यह, लघु सरल है, और सुंदर है अपने ही सवाल का जवाब देने नफरत है, लेकिन मैं वास्तव में समुदाय की तरह महसूस करना चाहिए सी # 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); 
    ... 
} 

आप इस प्रकार जावास्क्रिप्ट में अपने ब्राउज़र सहायक वस्तु का उपयोग कर सकते हैं:

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

या सिर्फ

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

यही है। दीवार के खिलाफ अपने सिर को टक्कर मारना बंद करो और जश्न मनाएं!

+6

की COM संदर्भ जारी करने के लिए सुनिश्चित करने के लिए अपने खुद के सवाल का जवाब देने के लिए अफसोस मत करो .. की जरूरत है, क्योंकि मैं) लोग उत्तर के लिए और नहीं व्यक्ति के लिए देखो जिन्होंने उत्तर दिया, ii) आपके पास कोई समस्या पोस्ट की गई है और आप इसका उत्तर देने में सक्षम हैं इसका मतलब है कि आपने इस पर काम किया है .. वह 'गंभीरता से अच्छी बात है .. बधाई .... – Tirumudi

+1

हाय फिक्स्ड पॉइंट। क्या आप एक पूर्ण कामकाजी प्रोटोटाइप पोस्ट कर सकते हैं? मैंने वास्तव में इसे और मेरी खिड़की को दोबारा करने की कोशिश की। मेरा एक्सटेंशन 'अपरिभाषित' रहता है मैंने इस प्रश्न को मेरे पूर्ण स्रोत [यहां] के साथ पोस्ट किया [http://stackoverflow.com/questions/15068872/calling-c-sharp-bho-methods- जावास्क्रिप्ट-अभी भी काम नहीं कर रहा है) –

+0

मेरे लिए यह मेरे पृष्ठ में कुछ जावास्क्रिप्ट लोड करने में विफल रहता है - बिना किसी बाहरी स्क्रिप्ट संदर्भ के पृष्ठों पर यह ठीक है, जैसे ही मेरे पास बाहरी स्क्रिप्ट संदर्भ होता है, यह विफल हो जाता है। यह भी अजीब बात है, एक बार जब यह विफल हो जाता है तो यह उन पृष्ठों पर असफल रहता रहता है जो पहले काम करते थे। –

0

इसके अलावा, आप संपत्ति जोड़ने के बाद आप खिड़की और windowEx