Internet Explorer एक्सटेंशन विकसित करने के साथ कैसे आरंभ करें?


207

क्या किसी के पास IE एक्सटेंशन को विकसित करने में / उसके साथ अनुभव है जो अपने ज्ञान को साझा कर सकते हैं? इसमें कोड नमूने, या अच्छे लोगों से लिंक, या प्रक्रिया पर प्रलेखन, या कुछ भी शामिल होगा।

मैं वास्तव में ऐसा करना चाहता हूं, लेकिन मैं घटिया प्रलेखन, घटिया कोड / उदाहरण कोड / अभाव के साथ एक विशाल दीवार मार रहा हूं। आपके द्वारा दी जा सकने वाली कोई भी मदद / संसाधन काफी सराहे जाएंगे।

विशेष रूप से, मैं कैसे एक IE विस्तार के भीतर से डोम के लिए उपयोग / हेरफेर करने के लिए शुरू करने के साथ शुरू करना चाहते हैं।

EDIT, और भी अधिक विवरण:

आदर्श रूप से, मैं एक टूलबार बटन लगाना चाहता हूं, जिसे क्लिक करने पर, एक मेनू पॉप अप होता है जिसमें बाहरी साइटों के लिंक होते हैं। मैं कुछ शर्तों के आधार पर DOM और पेज पर JavaScript को एक्सेस करना भी चाहूंगा।

IE एक्सटेंशन में जानकारी को बनाए रखने का सबसे अच्छा तरीका क्या है? फ़ायरफ़ॉक्स / क्रोम / अधिकांश आधुनिक ब्राउज़र में, आप उपयोग करते हैं window.localStorage, लेकिन जाहिर है IE8 / IE7 के साथ, यह एक विकल्प नहीं है। शायद एक SQLite DB या ऐसा? यह मान लेना ठीक है कि .NET 4.0 उपयोगकर्ता के कंप्यूटर पर स्थापित किया जाएगा?

मैं स्पाइस IE का उपयोग नहीं करना चाहता क्योंकि मैं एक ऐसा निर्माण करना चाहता हूं जो IE9 के साथ भी संगत हो। मैंने C ++ टैग को इस प्रश्न के साथ भी जोड़ा है, क्योंकि यदि C ++ में एक बनाना बेहतर है, तो मैं ऐसा कर सकता हूं।


1
IMHO IE 9 पिछले संस्करणों की तुलना में बेहतर परिमाण का आदेश है। (ऐसा नहीं है कि मैं क्रोम को IE के लिए छोड़ दूँगा ... वैसे भी नहीं।)
user541686

1
@ एलेक्स: आप किस तरह की चीजों को IE में लागू करने की कल्पना करते हैं, ताकि हम सही सामान्य दिशा में खुदाई शुरू कर सकें?
ग्रेग

@ एलेक्स: इस समस्या को प्रबंधनीय टुकड़ों में तोड़ने के लिए, मुझे निम्नलिखित बातों को जानना होगा: क्या हम यह मान सकते हैं कि एंड-यूज़र IE9 चला रहे होंगे और डॉटनेट 4.0 रनटाइम स्थापित करने के लिए तैयार होंगे?
ग्रेग

मैं ग्रेगसी से सहमत हूं। कुछ और जानकारी यहाँ मदद करेगी। क्या आप एक टूलबार की तरह कुछ सोच रहे हैं, या शायद कुछ ऐसा है जो उपयोगकर्ता को ब्राउज़ करने या कुछ और करने के लिए पूर्व-प्रक्रिया करेगा जो एक तीसरे नंबर की सेवा से जुड़ जाएगा।
23

4
@Alex, पर एक नज़र डालें Crossrider । यह आपके जीवन को बहुत आसान बना देगा।
शूल

जवाबों:


229

[अद्यतन] मैं के साथ काम करने के लिए इस उत्तर को अद्यतन करने कर रहा हूँ Internet Explorer 11 में, Windows 10 64 के साथ दृश्य स्टूडियो 2017 समुदाय । इस उत्तर का पिछला संस्करण (इंटरनेट एक्सप्लोरर 8 के लिए, विंडोज 7 x64 और विज़ुअल स्टूडियो 2010 में) इस उत्तर के निचले भाग पर है।

वर्किंग इंटरनेट एक्सप्लोरर 11 ऐड-ऑन बनाना

मैं Visual Studio 2017 कम्युनिटी , C # , .Net फ्रेमवर्क 4.6.1 का उपयोग कर रहा हूं , इसलिए इनमें से कुछ चरण आपके लिए थोड़े अलग हो सकते हैं।

आप की जरूरत है प्रशासक के रूप में दृश्य स्टूडियो खोलने के लिए इतना है कि बाद के निर्माण स्क्रिप्ट BHO (जरूरतों रजिस्ट्री पहुँच) रजिस्टर कर सकते हैं, समाधान का निर्माण करने के लिए।

क्लास लाइब्रेरी बनाकर शुरुआत करें। मैंने मेरा InternetExplorerExtension कहा ।

इन संदर्भों को परियोजना में जोड़ें:

  • Interop.SHDocVw: COM टैब / के लिए खोजें "Microsoft Internet Controls"
  • Microsoft.mshtml: असेंबली टैब / खोज "Microsoft.mshtml"

नोट: किसी तरह MSHTML मेरे सिस्टम में पंजीकृत नहीं था, भले ही मैं संदर्भ संदर्भ विंडो में पा सकता था। इसके निर्माण में त्रुटि हुई:

टाइप लाइब्रेरी "MSHTML" के लिए रैपर असेंबली नहीं मिल सकती

फिक्स http://techninotes.blogspot.com/2016/08/fixing-cannot-find-wrapper-assembly-for.html पर पाया जा सकता है, या आप इस बैच स्क्रिप्ट को चला सकते हैं:

"%ProgramFiles(x86)%\Microsoft Visual Studio\2017\Community\Common7\Tools\VsDevCmd.bat"
cd "%ProgramFiles(x86)%\Microsoft Visual Studio\2017\Community\Common7\IDE\PublicAssemblies"
regasm Microsoft.mshtml.dll
gacutil /i Microsoft.mshtml.dll

निम्न फ़ाइलें बनाएँ:

IEAddon.cs

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using Microsoft.Win32;
using mshtml;
using SHDocVw;

namespace InternetExplorerExtension
{
    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.None)]
    [Guid("D40C654D-7C51-4EB3-95B2-1E23905C2A2D")]
    [ProgId("MyBHO.WordHighlighter")]
    public class WordHighlighterBHO : IObjectWithSite, IOleCommandTarget
    {
        const string DefaultTextToHighlight = "browser";

        IWebBrowser2 browser;
        private object site;

        #region Highlight Text
        void OnDocumentComplete(object pDisp, ref object URL)
        {
            try
            {
                // @Eric Stob: Thanks for this hint!
                // This was used to prevent this method being executed more than once in IE8... but now it seems to not work anymore.
                //if (pDisp != this.site)
                //    return;

                var document2 = browser.Document as IHTMLDocument2;
                var document3 = browser.Document as IHTMLDocument3;

                var window = document2.parentWindow;
                window.execScript(@"function FncAddedByAddon() { alert('Message added by addon.'); }");

                Queue<IHTMLDOMNode> queue = new Queue<IHTMLDOMNode>();
                foreach (IHTMLDOMNode eachChild in document3.childNodes)
                    queue.Enqueue(eachChild);

                while (queue.Count > 0)
                {
                    // replacing desired text with a highlighted version of it
                    var domNode = queue.Dequeue();

                    var textNode = domNode as IHTMLDOMTextNode;
                    if (textNode != null)
                    {
                        if (textNode.data.Contains(TextToHighlight))
                        {
                            var newText = textNode.data.Replace(TextToHighlight, "<span style='background-color: yellow; cursor: hand;' onclick='javascript:FncAddedByAddon()' title='Click to open script based alert window.'>" + TextToHighlight + "</span>");
                            var newNode = document2.createElement("span");
                            newNode.innerHTML = newText;
                            domNode.replaceNode((IHTMLDOMNode)newNode);
                        }
                    }
                    else
                    {
                        // adding children to collection
                        var x = (IHTMLDOMChildrenCollection)(domNode.childNodes);
                        foreach (IHTMLDOMNode eachChild in x)
                        {
                            if (eachChild is mshtml.IHTMLScriptElement)
                                continue;
                            if (eachChild is mshtml.IHTMLStyleElement)
                                continue;

                            queue.Enqueue(eachChild);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        #endregion
        #region Load and Save Data
        static string TextToHighlight = DefaultTextToHighlight;
        public static string RegData = "Software\\MyIEExtension";

        [DllImport("ieframe.dll")]
        public static extern int IEGetWriteableHKCU(ref IntPtr phKey);

        private static void SaveOptions()
        {
            // In IE 7,8,9,(desktop)10 tabs run in Protected Mode
            // which prohibits writes to HKLM, HKCU.
            // Must ask IE for "Writable" registry section pointer
            // which will be something like HKU/S-1-7***/Software/AppDataLow/
            // In "metro" IE 10 mode, tabs run in "Enhanced Protected Mode"
            // where BHOs are not allowed to run, except in edge cases.
            // see http://blogs.msdn.com/b/ieinternals/archive/2012/03/23/understanding-ie10-enhanced-protected-mode-network-security-addons-cookies-metro-desktop.aspx
            IntPtr phKey = new IntPtr();
            var answer = IEGetWriteableHKCU(ref phKey);
            RegistryKey writeable_registry = RegistryKey.FromHandle(
                new Microsoft.Win32.SafeHandles.SafeRegistryHandle(phKey, true)
            );
            RegistryKey registryKey = writeable_registry.OpenSubKey(RegData, true);

            if (registryKey == null)
                registryKey = writeable_registry.CreateSubKey(RegData);
            registryKey.SetValue("Data", TextToHighlight);

            writeable_registry.Close();
        }
        private static void LoadOptions()
        {
            // In IE 7,8,9,(desktop)10 tabs run in Protected Mode
            // which prohibits writes to HKLM, HKCU.
            // Must ask IE for "Writable" registry section pointer
            // which will be something like HKU/S-1-7***/Software/AppDataLow/
            // In "metro" IE 10 mode, tabs run in "Enhanced Protected Mode"
            // where BHOs are not allowed to run, except in edge cases.
            // see http://blogs.msdn.com/b/ieinternals/archive/2012/03/23/understanding-ie10-enhanced-protected-mode-network-security-addons-cookies-metro-desktop.aspx
            IntPtr phKey = new IntPtr();
            var answer = IEGetWriteableHKCU(ref phKey);
            RegistryKey writeable_registry = RegistryKey.FromHandle(
                new Microsoft.Win32.SafeHandles.SafeRegistryHandle(phKey, true)
            );
            RegistryKey registryKey = writeable_registry.OpenSubKey(RegData, true);

            if (registryKey == null)
                registryKey = writeable_registry.CreateSubKey(RegData);
            registryKey.SetValue("Data", TextToHighlight);

            if (registryKey == null)
            {
                TextToHighlight = DefaultTextToHighlight;
            }
            else
            {
                TextToHighlight = (string)registryKey.GetValue("Data");
            }
            writeable_registry.Close();
        }
        #endregion

        [Guid("6D5140C1-7436-11CE-8034-00AA006009FA")]
        [InterfaceType(1)]
        public interface IServiceProvider
        {
            int QueryService(ref Guid guidService, ref Guid riid, out IntPtr ppvObject);
        }

        #region Implementation of IObjectWithSite
        int IObjectWithSite.SetSite(object site)
        {
            this.site = site;

            if (site != null)
            {
                LoadOptions();

                var serviceProv = (IServiceProvider)this.site;
                var guidIWebBrowserApp = Marshal.GenerateGuidForType(typeof(IWebBrowserApp)); // new Guid("0002DF05-0000-0000-C000-000000000046");
                var guidIWebBrowser2 = Marshal.GenerateGuidForType(typeof(IWebBrowser2)); // new Guid("D30C1661-CDAF-11D0-8A3E-00C04FC9E26E");
                IntPtr intPtr;
                serviceProv.QueryService(ref guidIWebBrowserApp, ref guidIWebBrowser2, out intPtr);

                browser = (IWebBrowser2)Marshal.GetObjectForIUnknown(intPtr);

                ((DWebBrowserEvents2_Event)browser).DocumentComplete +=
                    new DWebBrowserEvents2_DocumentCompleteEventHandler(this.OnDocumentComplete);
            }
            else
            {
                ((DWebBrowserEvents2_Event)browser).DocumentComplete -=
                    new DWebBrowserEvents2_DocumentCompleteEventHandler(this.OnDocumentComplete);
                browser = null;
            }
            return 0;
        }
        int IObjectWithSite.GetSite(ref Guid guid, out IntPtr ppvSite)
        {
            IntPtr punk = Marshal.GetIUnknownForObject(browser);
            int hr = Marshal.QueryInterface(punk, ref guid, out ppvSite);
            Marshal.Release(punk);
            return hr;
        }
        #endregion
        #region Implementation of IOleCommandTarget
        int IOleCommandTarget.QueryStatus(IntPtr pguidCmdGroup, uint cCmds, ref OLECMD prgCmds, IntPtr pCmdText)
        {
            return 0;
        }
        int IOleCommandTarget.Exec(IntPtr pguidCmdGroup, uint nCmdID, uint nCmdexecopt, IntPtr pvaIn, IntPtr pvaOut)
        {
            try
            {
                // Accessing the document from the command-bar.
                var document = browser.Document as IHTMLDocument2;
                var window = document.parentWindow;
                var result = window.execScript(@"alert('You will now be allowed to configure the text to highlight...');");

                var form = new HighlighterOptionsForm();
                form.InputText = TextToHighlight;
                if (form.ShowDialog() != DialogResult.Cancel)
                {
                    TextToHighlight = form.InputText;
                    SaveOptions();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

            return 0;
        }
        #endregion

        #region Registering with regasm
        public static string RegBHO = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Browser Helper Objects";
        public static string RegCmd = "Software\\Microsoft\\Internet Explorer\\Extensions";

        [ComRegisterFunction]
        public static void RegisterBHO(Type type)
        {
            string guid = type.GUID.ToString("B");

            // BHO
            {
                RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(RegBHO, true);
                if (registryKey == null)
                    registryKey = Registry.LocalMachine.CreateSubKey(RegBHO);
                RegistryKey key = registryKey.OpenSubKey(guid);
                if (key == null)
                    key = registryKey.CreateSubKey(guid);
                key.SetValue("Alright", 1);
                registryKey.Close();
                key.Close();
            }

            // Command
            {
                RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(RegCmd, true);
                if (registryKey == null)
                    registryKey = Registry.LocalMachine.CreateSubKey(RegCmd);
                RegistryKey key = registryKey.OpenSubKey(guid);
                if (key == null)
                    key = registryKey.CreateSubKey(guid);
                key.SetValue("ButtonText", "Highlighter options");
                key.SetValue("CLSID", "{1FBA04EE-3024-11d2-8F1F-0000F87ABD16}");
                key.SetValue("ClsidExtension", guid);
                key.SetValue("Icon", "");
                key.SetValue("HotIcon", "");
                key.SetValue("Default Visible", "Yes");
                key.SetValue("MenuText", "&Highlighter options");
                key.SetValue("ToolTip", "Highlighter options");
                //key.SetValue("KeyPath", "no");
                registryKey.Close();
                key.Close();
            }
        }

        [ComUnregisterFunction]
        public static void UnregisterBHO(Type type)
        {
            string guid = type.GUID.ToString("B");
            // BHO
            {
                RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(RegBHO, true);
                if (registryKey != null)
                    registryKey.DeleteSubKey(guid, false);
            }
            // Command
            {
                RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(RegCmd, true);
                if (registryKey != null)
                    registryKey.DeleteSubKey(guid, false);
            }
        }
        #endregion
    }
}

Interop.cs

using System;
using System.Runtime.InteropServices;
namespace InternetExplorerExtension
{
    [ComVisible(true)]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    [Guid("FC4801A3-2BA9-11CF-A229-00AA003D7352")]
    public interface IObjectWithSite
    {
        [PreserveSig]
        int SetSite([MarshalAs(UnmanagedType.IUnknown)]object site);
        [PreserveSig]
        int GetSite(ref Guid guid, [MarshalAs(UnmanagedType.IUnknown)]out IntPtr ppvSite);
    }


    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public struct OLECMDTEXT
    {
        public uint cmdtextf;
        public uint cwActual;
        public uint cwBuf;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
        public char rgwz;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct OLECMD
    {
        public uint cmdID;
        public uint cmdf;
    }

    [ComImport(), ComVisible(true),
    Guid("B722BCCB-4E68-101B-A2BC-00AA00404770"),
    InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IOleCommandTarget
    {

        [return: MarshalAs(UnmanagedType.I4)]
        [PreserveSig]
        int QueryStatus(
            [In] IntPtr pguidCmdGroup,
            [In, MarshalAs(UnmanagedType.U4)] uint cCmds,
            [In, Out, MarshalAs(UnmanagedType.Struct)] ref OLECMD prgCmds,
            //This parameter must be IntPtr, as it can be null
            [In, Out] IntPtr pCmdText);

        [return: MarshalAs(UnmanagedType.I4)]
        [PreserveSig]
        int Exec(
            //[In] ref Guid pguidCmdGroup,
            //have to be IntPtr, since null values are unacceptable
            //and null is used as default group!
            [In] IntPtr pguidCmdGroup,
            [In, MarshalAs(UnmanagedType.U4)] uint nCmdID,
            [In, MarshalAs(UnmanagedType.U4)] uint nCmdexecopt,
            [In] IntPtr pvaIn,
            [In, Out] IntPtr pvaOut);
    }
}

और अंत में एक फॉर्म, जिसका उपयोग हम विकल्पों को कॉन्फ़िगर करने के लिए करेंगे। इस रूप में एक TextBoxऔर एक ठीक जगह है Buttonठीक करने के लिए बटन का DialogResult सेट करें । इस कोड को फॉर्म कोड में रखें:

using System.Windows.Forms;
namespace InternetExplorerExtension
{
    public partial class HighlighterOptionsForm : Form
    {
        public HighlighterOptionsForm()
        {
            InitializeComponent();
        }

        public string InputText
        {
            get { return this.textBox1.Text; }
            set { this.textBox1.Text = value; }
        }
    }
}

परियोजना गुणों में, निम्नलिखित करें:

  • एक मजबूत-कुंजी के साथ विधानसभा पर हस्ताक्षर करें;
  • डीबग टैब में, सेट बाहरी प्रारंभ कार्यक्रम के लिएC:\Program Files (x86)\Internet Explorer\iexplore.exe
  • डीबग टैब में, कमांड लाइन तर्क सेट करने के लिएhttp://msdn.microsoft.com/en-us/library/ms976373.aspx#bho_getintouch
  • बिल्ड ईवेंट टैब में, पोस्ट-बिल्ड ईवेंट कमांड लाइन को निम्न पर सेट करें:

    "% ProgramFiles (x86)% \ Microsoft SDKs \ Windows \ v10.0A \ bin \ NETFX 4.6.1 उपकरण \ gacutil.exe" / f / i "$ (TargetDir) $ (TargetFileName)"
    
    "% विंडीर% \ Microsoft.NET \ फ्रेमवर्क \ v4.0.30319 \ RegAsm.exe" / अपंजीकृत "$ (लक्ष्यDir) $ (TargetFileName)"
    
    "% विंडिर% \ Microsoft.NET \ फ्रेमवर्क \ v4.0.30319 \ RegAsm.exe" "$ (TargetDir) $ (TargetFileName)"

ध्यान दें: भले ही मेरा कंप्यूटर x64 है, मैंने गैर- x64 के पथ का उपयोग किया gacutil.exeऔर यह काम किया ... x64 के लिए एक विशिष्ट है:

C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v10.0A \ bin \ NETFX 4.6.1 उपकरण \ x64 \ gacutil.exe

64 बिट IE 64 बिट संकलित और 64 बिट पंजीकृत BHO की आवश्यकता है। हालाँकि मैं केवल 32bit IE11 का उपयोग करके डिबग कर सकता था, 32bit पंजीकृत एक्सटेंशन ने 64bit IE11 चलाकर भी काम किया।

यह उत्तर इस बारे में कुछ अतिरिक्त जानकारी देता है: https://stackoverflow.com/a/23004613/195417

यदि आप की जरूरत है, तो आप 64 बिट का उपयोग कर सकते हैं:

% विंडीर % \ Microsoft.NET \ Framework 64 \ v4.0.30319 \ RegAsm.exe

यह ऐड कैसे काम करता है

मैंने ऐड-ऑन के व्यवहार को नहीं बदला ... विवरण के लिए IE8 सेक्शन बोले पर एक नज़र डालें।


IE8 के लिए ## पिछला उत्तर

यार ... ये तो बहुत काम का है! मैं यह करने के लिए बहुत उत्सुक था, कि मैंने इसे स्वयं किया था।

सबसे पहले ... क्रेडिट सब मेरा नहीं है। इन साइटों पर मुझे जो कुछ मिला है, उसका संकलन है:

और निश्चित रूप से, मैं चाहता था कि आप मेरे द्वारा मांगे गए फीचर्स का जवाब दें:

  • डोम ट्रैवर्सल कुछ खोजने के लिए;
  • एक बटन जो एक विंडो दिखाता है (मेरे मामले में सेटअप में)
  • कॉन्फ़िगरेशन जारी रखें (मैं उसके लिए रजिस्ट्री का उपयोग करूंगा)
  • और अंत में जावास्क्रिप्ट निष्पादित करें।

मैं इसे चरण दर चरण बताऊंगा, कि कैसे मैं इसे इंटरनेट एक्सप्लोरर 8 के साथ विंडोज 7 x64 में काम करने में कामयाब रहा ... ध्यान दें कि मैं अन्य कॉन्फ़िगरेशन में परीक्षण नहीं कर सका। आशा है कि आप समझते हैं =)

वर्किंग इंटरनेट एक्सप्लोरर 8 ऐड-ऑन बनाना

मैं Visual Studio 2010 , C # 4 , .Net फ्रेमवर्क 4 का उपयोग कर रहा हूं , इसलिए इनमें से कुछ चरण आपके लिए थोड़े भिन्न हो सकते हैं।

एक क्लास लाइब्रेरी बनाई। मैंने मेरा InternetExplorerExtension कहा ।

इन संदर्भों को परियोजना में जोड़ें:

  • Interop.SHDocVw
  • Microsoft.mshtml

नोट: ये संदर्भ प्रत्येक कंप्यूटर में विभिन्न स्थानों पर हो सकते हैं।

यह csproj में मेरे संदर्भ खंड में है:

<Reference Include="Interop.SHDocVw, Version=1.1.0.0, Culture=neutral, PublicKeyToken=90ba9c70f846762e, processorArchitecture=MSIL">
  <SpecificVersion>False</SpecificVersion>
  <EmbedInteropTypes>True</EmbedInteropTypes>
  <HintPath>C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\PrivateAssemblies\Interop.SHDocVw.dll</HintPath>
</Reference>
<Reference Include="Microsoft.CSharp" />
<Reference Include="Microsoft.mshtml, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
  <EmbedInteropTypes>True</EmbedInteropTypes>
</Reference>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />

अद्यतित IE11 फ़ाइलों की तरह ही फ़ाइलें बनाएँ।

IEAddon.cs

आप IE11 संस्करण से निम्न पंक्तियों को अनइंस्टॉल कर सकते हैं:

...
// @Eric Stob: Thanks for this hint!
// This was used to prevent this method being executed more than once in IE8... but now it seems to not work anymore.
if (pDisp != this.site)
    return;
...

Interop.cs

IE11 संस्करण के समान।

और अंत में एक फॉर्म, जिसका उपयोग हम विकल्पों को कॉन्फ़िगर करने के लिए करेंगे। इस रूप में एक TextBoxऔर एक ठीक जगह है Buttonठीक करने के लिए बटन का DialogResult सेट करें । कोड IE11 एडऑन के लिए समान है।

परियोजना गुणों में, निम्नलिखित करें:

  • एक मजबूत-कुंजी के साथ विधानसभा पर हस्ताक्षर करें;
  • डीबग टैब में, सेट बाहरी प्रारंभ कार्यक्रम के लिएC:\Program Files (x86)\Internet Explorer\iexplore.exe
  • डीबग टैब में, कमांड लाइन तर्क सेट करने के लिएhttp://msdn.microsoft.com/en-us/library/ms976373.aspx#bho_getintouch
  • बिल्ड ईवेंट टैब में, पोस्ट-बिल्ड ईवेंट कमांड लाइन को निम्न पर सेट करें:

    "C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin \ NETFX 4.0 टूल \ x64 \ gacutil.exe" / f / i "$ (TargetDir) $ (TargetFileName)"
    
    "C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ RegAsm.exe" / unregister "$ (TargetDir) $ (TargetFileName)"
    
    "C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ RegAsm.exe" "$ (TargetDir) $ (TargetFileName)"

ध्यान दें: जैसा कि मेरा कंप्यूटर x64 है, मेरी मशीन पर gacutil निष्पादन योग्य के पथ के अंदर एक विशिष्ट x64 है जो कि आप पर अलग हो सकता है।

64 बिट IE 64 बिट संकलित और 64 बिट पंजीकृत BHO की आवश्यकता है। 64bit RegAsm.exe का उपयोग करें (आमतौर पर C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ RegAsm.exe में रहता है)

यह ऐड कैसे काम करता है

यह सभी DOM ट्री को हटाता है, पाठ की जगह, बटन का उपयोग करके कॉन्फ़िगर किया गया है, अपने आप में एक पीले रंग की पृष्ठभूमि के साथ। यदि आप पीले पाठों पर क्लिक करते हैं, तो यह एक जावास्क्रिप्ट फ़ंक्शन को कॉल करता है जिसे गतिशील रूप से पृष्ठ पर डाला गया था। डिफ़ॉल्ट शब्द 'ब्राउज़र' है, ताकि यह उनमें से बहुत से मेल खाता हो! संपादित करें: स्ट्रिंग को हाइलाइट किए जाने के बाद, आपको URL बॉक्स पर क्लिक करना होगा और Enter दबाएं ... F5 काम नहीं करेगा, मुझे लगता है कि ऐसा इसलिए है क्योंकि F5 को 'नेविगेशन' माना जाता है, और इसे नेविगेट करने की घटना सुनने की आवश्यकता होगी (शायद)। मैं बाद में इसे ठीक करने की कोशिश करूंगा।

अब, यह जाने का समय है। बहुत थक गई हूं। बेझिझक सवाल पूछें ... हो सकता है कि मैं जवाब नहीं दे पाऊंगा क्योंकि मैं यात्रा पर जा रहा हूं ... 3 दिन में वापस आ रहा हूं, लेकिन मैं इस बीच यहां आने की कोशिश करूंगा।


2
नमस्ते, मैंने वही किया जो उत्तर में वर्णित है। बटन दिखाई दे रहा है। निष्पादन का समापन तेज है। हालाँकि, SetSite और GetSite फ़ंक्शन को कभी नहीं कहा जाता है। मैं उस पृष्ठ का URL जानना चाहता हूं जिस पर मैं हूं। यह ब्राउज़र को इनिशियलाइज़ करने के लिए इन तरीकों को कॉल करने में विफल हो रहा है .. कृपया मदद करें
Mustafabar

3
मैंने IE9 पर यह करने की कोशिश की और: 1. यदि आपके प्रोजेक्ट पथ में रिक्त स्थान हैं: $(TargetDir)$(TargetFileName)उपयोग के बजाय "$(TargetDir)$(TargetFileName)" 2. यदि आप विज़ुअल स्टूडियो 2010 एक्सप्रेस का उपयोग करते हैं तो आप संभवतः (मैं करते हैं) डीबग टैब में बाहरी प्रोग्राम प्रारंभ करें विकल्प नहीं देखें - I बस IE चलाएं और प्रदान किए गए URL पर नेविगेट करें। ऐसा लगता है कि IE9 पर काम नहीं करना है - मैं फॉर्म (हाइलाइटर विकल्प) खोल सकता हूं, लेकिन मुझे यह नहीं पता है कि इसे टेक्स्ट को कैसे उजागर किया जाए
pinus.acer

8
Interop.SHDocVw संदर्भ के लिए - इसके बजाय आपको "Microsoft इंटरनेट नियंत्रण" और फिर "SHDocVw का उपयोग करते हुए" एक COM संदर्भ जोड़ना चाहिए;
एरिक हार्टफोर्ड

8
"X64 विंडोज 8 पर IE10 आपके ऐड-ऑन को तब तक लोड नहीं करेगा, जब तक कि आप" किसी भी सीपीयू "आर्किटेक्चर के साथ निर्माण नहीं करेंगे और 32 और 64 बिट RegAsm.exe दोनों का उपयोग करके रजिस्टर करेंगे।" किसी ऐसे व्यक्ति द्वारा संपादित किया गया जिसे अस्वीकार कर दिया गया।
मात्सेमन्न

3
कृपया अनुवर्ती कार्रवाई देखें: stackoverflow.com/questions/22953571/…

12

एक और अच्छा तरीका यह देखना होगा:

http://www.crossrider.org

यह jquery के साथ JS पर आधारित एक रूपरेखा है जो आपको IE, FF और Chrome के लिए एकल सामान्य JS कोड का उपयोग करके ब्राउज़र एक्सटेंशन विकसित करने देता है। मूल रूप से फ्रेमवर्क सभी खराब काम करता है और आपको अपने एप्लिकेशन कोड लिखने के लिए छोड़ दिया जाता है।


हाँ, यह वास्तव में जाने का तरीका है, साथ ही बुरे सपने से बचना है जो दृश्य स्टूडियो में एक प्लगइन विकसित कर रहा है इसका मतलब है कि आपको केवल सभी ब्राउज़रों के लिए एक बार अपना प्लगइन लिखना होगा। इसका मतलब यह भी है कि यदि आप एक मैक उपयोगकर्ता हैं तो वर्चुअल मशीन में विकसित नहीं हो सकते।
opsb

11

IE एक्सटेंशन के लिए राज्य वास्तव में बहुत दुख की बात है। आपके पास IE5 ब्राउज़र हेल्पर ऑब्जेक्ट (हाँ, उन बदनाम BHOs ​​का पुराना मॉडल है जो हर किसी को दिन में वापस ब्लॉक करना पसंद करते हैं), टूलबार और IE के लिए नया त्वरक। फिर भी, संगतता कभी-कभी टूट जाएगी। मैं IE7 के लिए एक विस्तार बनाए रखता था जो IE7 के साथ टूट गया था, इसलिए कुछ चीजें हैं जो बदल गई हैं। अधिकांश भाग के लिए, जहां तक ​​मुझे पता है (मैंने वर्षों में BHOs ​​को नहीं छुआ है) आपको अभी भी सक्रिय टेम्पलेट पुस्तकालयों (Microsoft के COM के लिए एक एसटीएल की तरह) का उपयोग करके उन्हें कोड करने की आवश्यकता है और साथ ही ऐसा केवल C ++ के लिए है। आप COM इंटरोप को C # के साथ कर सकते हैं और इसे C # में करने से दूर हो सकते हैं, लेकिन इसका मूल्य बहुत मुश्किल है। वैसे भी,

http://msdn.microsoft.com/en-us/library/aa753587(v=vs.85).aspx

और IE8 में नए हैं कि त्वरक के लिए आप इस एक की जाँच कर सकते हैं।

http://msdn.microsoft.com/en-us/library/cc289775(v=vs.85).aspx

मैं मानता हूं कि प्रलेखन बहुत भयानक है, और एपीआई काफी पुराने हैं। फिर भी मुझे उम्मीद है कि इससे मदद मिलेगी।

संपादित करें: मुझे लगता है कि मैं जानकारी के एक अंतिम स्रोत को यहां फेंक सकता हूं। जब मैं बीएचओ पर काम कर रहा था तब मैं अपने नोटों को वापस देख रहा था। और यह वह लेख है जो मुझे उनसे मिला है। यह पुराने जैसा है, लेकिन एटीएल इंटरफेस का एक अच्छा विवरण है जिसे आप IE BHOs ​​(उदाहरण के लिए IObjectWithSite) के साथ काम करते समय उपयोग करेंगे। मुझे लगता है कि यह बहुत अच्छी तरह से समझाया गया है और तब मुझे बहुत मदद मिली। http://msdn.microsoft.com/en-us/library/bb250436.aspx मैंने उस उदाहरण को भी जांचा जो ग्रेग ने पोस्ट किया था। यह कम से कम IE8 के साथ काम करता है, और यह वीएस 2010 के साथ संगत है, इसलिए यदि आप सी # करना चाहते हैं तो आप वहां शुरू कर सकते हैं और जॉन स्कीट बुक पर एक नज़र डाल सकते हैं। (सी # डेथ 2 वें संस्करण में) अध्याय 13 में सी # 4 में नई सुविधाओं के बारे में अच्छी जानकारी है जिसका उपयोग आप COM नाइसर के साथ बातचीत करने के लिए कर सकते हैं। (मैं अभी भी आपको C ++ में अपना एड करने की सलाह दूंगा)


6

C # BHO का विकास एक दर्द-में-गधा है। इसमें icky COM कोड और p / invoke कॉल की एक बहुत कुछ शामिल है।

मेरे पास यहां ज्यादातर C # BHO है , जिसे आप जो चाहें स्रोत के लिए उपयोग करने के लिए स्वतंत्र हैं। मैं "ज्यादातर" कहता हूं , क्योंकि मैंने कभी भी यह नहीं सोचा कि आईई संरक्षित मोड के तहत ऐपडाटा को कैसे बचाया जाए


4
इस संबंध में C # 4.0 बेहतर हो सकता है, क्योंकि COM इंटरोप में बहुत सुधार हुआ है।
रॉबर्ट हार्वे

@ रॉबर्ट: सच में? मुझे पता नहीं था ... क्या अंतर हैं?
user541686

@ मेहरदाद: आप यहां मतभेदों का स्वाद ले सकते हैं: devx.com/dotnet/Article/42590/1954 । अधिक गहन चर्चा के लिए, एंडर्स हेजलबर्ग की चर्चा, "द फ्यूचर ऑफ सी #," यहां देखें: Channel9.msdn.com/Blogs/pdc2008/TL16
रॉबर्ट हार्वे

1
@ रोबर्ट @ मेहरदाद: वास्तव में नहीं। यह COM इंटरॉप नहीं है जो icky है (इस संबंध में) , यह COM मॉड्यूल विकसित और पंजीकृत कर रहा है, जिसके साथ नई C # 4.0 सुविधाएँ मदद नहीं करती हैं।
ब्लूराजा - डैनी पफ्लुगुफ्ट

4

अब मैं IE के वेबब्रोसर नियंत्रण के साथ वर्षों से काम कर रहा हूं, और उनमें से एक के बाद, एक नाम सहायक पोस्टिंग के साथ बार-बार आता है: इगोर टांडेटनिक

यदि मैं एक एक्सटेंशन विकसित कर रहा था, तो मैं एक BHO ​​को लक्षित करूंगा, और इसके लिए googling शुरू करूंगा:

बीएचओ इगोर टांडेटनिक

या

ब्राउज़र हेल्पर ऑब्जेक्ट इगोर Tandetnik

उनकी पोस्टिंग अक्सर बहुत विस्तृत होती है, और वह जानते हैं कि वह किस बारे में बात कर रहे हैं।

आप COM और ATL प्रोग्रामिंग में अपने कानों तक खुद को खोजने जा रहे हैं। एक नमूना वॉकथ्रू के लिए, बाहर की जाँच करें: http://msdn.microsoft.com/en-us/library/ms976373.aspx


C # का उपयोग करने के लिए सबसे बड़ा नकारात्मक पहलू (जो कि ज्यादातर अन्य पोस्टर जा रहे हैं) यह है कि यह कोड के लिए वर्कअराउंड और पैच के साथ सभी प्रकार की अतिरिक्त परतों से गुजरने वाला है, जो C ++ के मूल निवासी होंगे।
लिन क्रंबलिंग

3

मैं रॉबर्ट हार्वे के साथ सहमत हूं, सी # 4.0 सुविधाओं ने COM इंटरॉप में सुधार किया। यहाँ पुराने सी # कोड का एक सा है, फिर से लिखने की सख्त जरूरत है।

http://www.codeproject.com/KB/cs/Attach_BHO_with_C_.aspx

यह एटीएल से बचने और स्पार्टन कॉम के साथ जाकर चीजों को आसान बनाने का एक प्रयास है:

B ++ को प्राप्त करने के लिए C ++ और COM


3

यदि आप पहिया को सुदृढ़ करने की कोशिश नहीं कर रहे हैं, तो आप IE के लिए एक्सप्रेस में जोड़ सकते हैं । मैंने VSTO सामान के लिए उत्पाद का उपयोग किया है , और इसकी बहुत अच्छी है। इसके अलावा उनके पास एक उपयोगी मंच और त्वरित समर्थन है।


3

यह स्पष्ट रूप से हल किया गया है, लेकिन अन्य उपयोगकर्ताओं के लिए, मैं स्पाइसी ढांचे की सिफारिश करूंगा । मैंने इसके आधार पर अपना विस्तार किया है। यह केवल इंटरनेट एक्सप्लोरर 7/8 आधिकारिक का समर्थन करता है, लेकिन मैंने परीक्षण किया कि इंटरनेट एक्सप्लोरर 6-10 (विंडोज एक्सपी से विंडोज 8 उपभोक्ता पूर्वावलोकन पर) और यह ठीक काम करता है । दुर्भाग्य से नवीनतम रिलीज़ में कुछ कीड़े थे, इसलिए मुझे उन्हें ठीक करना पड़ा और अपनी खुद की रिलीज़ बनाई: http://archive.msdn.microsoft.com/SpicIE/Thread/View.aspx?ThreadId=5251


0

मैं आपको गर्मजोशी से सुझाव देता हूं कि 2002 में प्रकाशित पावेल ज़ोलनिकोव की यह पोस्ट!

http://www.codeproject.com/Articles/2219/Extending-Explorer-with-Band-Objects-using-NET-and

यह बैंड ऑब्जेक्ट्स के उपयोग पर आधारित है और .Net 2.0 का उपयोग करके संकलित किया गया है। सोर्स कोड प्रदान किया गया है और विजुअल स्टूडियो 2013 के साथ अच्छी तरह से खुलता और संकलित करता है। जैसा कि आप पोस्ट टिप्पणियों पर पढ़ेंगे यह IE 11 और विंडोज 7 और विंडोज 10 के लिए पूरी तरह से अच्छी तरह से काम करता है। यह विंडोज 7 + SP1 और IE पर मेरे लिए पूरी तरह से अच्छी तरह से काम किया 11 आनंद लें!


हम StackOverflow पर स्वयं को समाहित होने के उत्तर पसंद करते हैं। यह सब पोस्ट वास्तव में मुझे बताता है "बैंड ऑब्जेक्ट्स और .Net 2.0 का उपयोग करें"। क्या आप यह दिखाने के लिए यहां कुछ नमूना कोड शामिल कर सकते हैं कि यह कैसे किया जा सकता है?
तेयपेम सेप

0

सवाल 2013 का है, अब यह 2020 का है, लेकिन यह भविष्य के आगंतुकों के लिए मददगार हो सकता है।

मैंने @Miguel एंजेलो के जवाब को लागू करने की कोशिश की, यह शुरुआत में काम नहीं किया।

अभी भी कुछ सेटिंग्स हैं जिन्हें आप परिभाषित करते हैं।

इंटरनेट एक्सप्लोरर (मैं IE-11 का उपयोग कर रहा हूं) पर जाएं Tools-->Internet Options-->Advanced: यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें

इसके अलावा इस SO प्रश्न और github से इस उदाहरण को देखें


-2

यहां छवि विवरण दर्ज करें

बिल्ड ईवेंट्स टैब में, पोस्ट-बिल्ड इवेंट्स कमांड लाइन टू: (x64) नीचे सूचीबद्ध है

"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\x64\gacutil.exe" /if "$(TargetDir)$(TargetFileName)"    
"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe" /u "$(TargetDir)$(TargetFileName)"    
"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe" "$(TargetDir)$(TargetFileName)"

मुझे बिल्ड इवेंट्स टैब चाहिए, पोस्ट-बिल्ड इवेंट्स कमांड लाइन टू (32 बिट ऑपरेटिंग सिस्टम) सेट करें

"C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\gacutil.exe" /if "$(TargetDir)$(TargetFileName)"    
"C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe" /u "$(TargetDir)$(TargetFileName)"    
"C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe" "$(TargetDir)$(TargetFileName)"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.