কীভাবে ইন্টারনেট এক্সপ্লোরার এক্সটেনশানগুলি বিকাশ করে শুরু করবেন?


207

আইই এক্সটেনশানগুলির সাথে / বিকাশ করার জন্য এখানে কারও অভিজ্ঞতা আছে যা তাদের জ্ঞান ভাগ করে নিতে পারে? এর মধ্যে কোডের নমুনা, বা ভালগুলির লিঙ্কগুলি, বা প্রক্রিয়া সম্পর্কিত ডকুমেন্টেশন বা কোনও কিছু অন্তর্ভুক্ত থাকবে।

আমি সত্যিই এটি করতে চাই তবে আমি লুসি ডকুমেন্টেশন, লসি কোড / উদাহরণ কোড / এর অভাবের সাথে একটি বিশাল প্রাচীরটি আঘাত করছি। আপনার দেওয়া যে কোনও সহায়তা / সংস্থানগুলি প্রশংসিত হবে।

বিশেষত, আমি কীভাবে কোনও এক্সটেনশনের মধ্যে দিয়ে ডিওএমে অ্যাক্সেস / ম্যানিপুলেট করতে পারি তা দিয়ে শুরু করতে চাই।

সম্পাদনা, আরও বিশদ:

আদর্শভাবে, আমি একটি সরঞ্জামদণ্ড বোতাম লাগাতে চাই যা ক্লিক করার পরে, একটি মেনু পপড করা হয় যাতে বাহ্যিক সাইটগুলির লিঙ্ক থাকে। আমি ডিওএম অ্যাক্সেস করতে এবং কিছু অবস্থার উপর নির্ভর করে পৃষ্ঠায় জাভাস্ক্রিপ্ট লাগাতে চাই।

আইই এক্সটেনশনে তথ্য বজায় রাখার সর্বোত্তম উপায় কী? ফায়ারফক্স / ক্রোম / সর্বাধিক আধুনিক ব্রাউজারগুলিতে আপনি ব্যবহার করেনwindow.localStorage তবে স্পষ্টতই আইই 8 / আইই 7 দিয়ে এটি কোনও বিকল্প নয়। হতে পারে কোনও এসকিউএল ডিবি বা এরকম? এটা ধরে নেওয়া ঠিক আছে যে কোনও নেটওয়্যার ব্যবহারকারীর কম্পিউটারে নেট নেট installed.০ ইনস্টল করা হবে?

আমি স্পাইস আইই ব্যবহার করতে চাই না কারণ আমি আইই 9 এর সাথে সামঞ্জস্যপূর্ণ একটি তৈরি করতে চাই। আমি এই প্রশ্নের সাথেও সি ++ ট্যাগ যুক্ত করেছি, কারণ যদি সি ++ তে একটি তৈরি করা ভাল তবে আমি এটি করতে পারি।


1
আইএমএইচও আইই 9 হ'ল পূর্ববর্তী সংস্করণগুলির চেয়ে আরও বেশি মাত্রার অর্ডার। (এমন নয় যে আমি অবশ্যই
আইএম

1
@ অ্যালেক্স: আপনি কোন ধরণের জিনিসগুলি বাস্তবায়নের কথা ভাবেন আইইতে, যাতে আমরা সঠিক সাধারণ দিকটি খনন শুরু করতে পারি?
গ্রেগসি

@ অ্যালেক্স: এই সমস্যাটি পরিচালনাযোগ্য টুকরো টুকরো করার জন্য, আমাকে নিম্নলিখিতগুলি জানতে হবে: আমরা কী ধরে নিতে পারি যে শেষ-ব্যবহারকারী আইই 9 চালাবেন এবং ডটনেট 4.0 রানটাইম ইনস্টল করতে ইচ্ছুক হবেন?
গ্রেগসি

আমি গ্রেগের সাথে একমত আরও কিছু তথ্য এখানে সহায়তা করবে। আপনি কি কোনও সরঞ্জামদণ্ডের মতো কিছু, বা সম্ভবত এমন কিছু যা ভাবছেন যা ব্যবহারকারীরা যা ব্রাউজ করছেন তা প্রাক-প্রক্রিয়া করবে বা এমন কোনও কিছু যা তৃতীয় পক্ষের পরিষেবাতে সংযুক্ত হবে।
ক্লাউড্রভেন

4
@Alex, কটাক্ষপাত করা Crossrider । এটি আপনার জীবনকে আরও সহজ করে তুলবে।
shdev

উত্তর:


229

[আপডেট] আমি এই উত্তরটি ভিজুয়াল স্টুডিও 2017 সম্প্রদায়ের সাথে উইন্ডোজ 10 x64 এ , ইন্টারনেট এক্সপ্লোরার 11 এর সাথে কাজ করার জন্য আপডেট করছি । এই উত্তরের পূর্ববর্তী সংস্করণ (ইন্টারনেট এক্সপ্লোরার 8 এর জন্য, উইন্ডোজ 7 এক্স 64 এবং ভিজ্যুয়াল স্টুডিও 2010-এ) এই উত্তরের নীচে রয়েছে।

একটি ওয়ার্কিং ইন্টারনেট এক্সপ্লোরার 11 অ্যাড-অন তৈরি করা

আমি ব্যবহার করছি ভিসুয়াল স্টুডিও 2017 কমিউনিটি , সি # , .NET Framework 4.6.1 , তাই এই পদক্ষেপ কিছু তোমার জন্য কিছুটা ভিন্ন হতে পারে।

আপনাকে করার প্রয়োজন প্রশাসক হিসেবে ভিসুয়াল স্টুডিও খোলার যাতে পোস্ট বিল্ড স্ক্রিপ্ট BHO (চাহিদা রেজিস্ট্রি অ্যাক্সেস) নিবন্ধন করতে পারেন, সমাধান এবং নির্মান করে।

একটি ক্লাস লাইব্রেরি তৈরি করে শুরু করুন। আমি আমার ইন্টারনেটকে এক্সপ্লোরার এক্সটেনশন বলেছি ।

প্রকল্পে এই উল্লেখগুলি যুক্ত করুন:

  • Interop.SHDocVw: COM ট্যাব / অনুসন্ধান করুন "Microsoft Internet Controls"
  • মাইক্রোসফট.এমএসএইচটিএমএল: সমাবেশগুলি ট্যাব / অনুসন্ধান করে "Microsoft.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
  • ইভেন্টগুলি তৈরি করুন ট্যাবে, পোস্ট-বিল্ড ইভেন্ট ইভেন্ট কমান্ড লাইনটি এতে সেট করুন :

    "% প্রোগ্রামফায়ালস (x86)% \ মাইক্রোসফ্ট এসডিকে \ উইন্ডোজ \ v10.0A \ বিন \ নেটফএক্স 4.6.1 সরঞ্জাম Tools gacutil.exe" / এফ / আই "Tar (টার্গেটডির) Tar (টার্গেটফিলনাম)"
    
    "% উইন্ডির% \ Microsoft.NET \ ফ্রেমওয়ার্ক \ v4.0.30319 \ RegAsm.exe" / নিবন্ধভুক্ত "$ (টার্গেটডির) $ (TargetFileName)"
    
    "% উইন্ডির% \ Microsoft.NET \ ফ্রেমওয়ার্ক \ v4.0.30319 \ RegAsm.exe" "Tar (টার্গেটডির) $ (টার্গেটফিলনাম)"

মনোযোগ দিন: যদিও আমার কম্পিউটারটি এক্স 64, তবুও আমি নন-এক্স 64 এর পথটি ব্যবহার করেছি gacutil.exeএবং এটি কাজ করেছে ... এক্স 64 এর জন্য নির্দিষ্ট একটিটি এখানে:

সি: \ প্রোগ্রাম ফাইলগুলি (x86) \ মাইক্রোসফ্ট এসডিকে \ উইন্ডোজ \ v10.0A \ বিন \ নেটফএক্স 4.6.1 সরঞ্জামসমূহ \ x64 \ gacutil.exe

64 বিট আইই 64 বিট-সংকলিত এবং 64 বিবি-নিবন্ধিত বিএইচওর প্রয়োজন। যদিও আমি কেবল 32 বিবিট আইই 11 ব্যবহার করে ডিবাগ করতে পারি, 32 বিট নিবন্ধিত এক্সটেনশানও 64 বিবিট আইই 11 চালিয়ে কাজ করে।

এই উত্তরে এই সম্পর্কে কিছু অতিরিক্ত তথ্য রয়েছে বলে মনে হয়: https://stackoverflow.com/a/23004613/195417

আপনার যদি প্রয়োজন হয় তবে আপনি 64 বিট রেজিম ব্যবহার করতে পারেন:

% উইন্ডির% \ Microsoft.NET \ ফ্রেমওয়ার্ক 64 \ v4.0.30319 \ RegAsm.exe

এই অ্যাড-অন কীভাবে কাজ করে

আমি অ্যাড-অনের আচরণটি পরিবর্তন করি নি ... বর্ণনার জন্য আইই 8 বিভাগটি নিন।


## আইই 8 এর পূর্ববর্তী উত্তর

মানুষ ... এই অনেক কাজ হয়েছে! এটি কীভাবে করা যায় সে সম্পর্কে আমি এত কৌতূহল ছিলাম যে আমি নিজেই এটি করেছি।

সবার আগে ... ক্রেডিট সব আমার নয়। এই সাইটগুলিতে আমি যা পেয়েছি তার একটি সংকলন:

এবং অবশ্যই, আমি আমার উত্তরটি চেয়েছিলাম যে বৈশিষ্ট্যগুলি আপনি জিজ্ঞাসা করেছেন:

  • কিছু খুঁজে পেতে ডোম ট্র্যাভারসাল;
  • একটি বোতাম যা একটি উইন্ডো দেখায় (সেটআপ করার ক্ষেত্রে আমার ক্ষেত্রে)
  • কনফিগারেশন অব্যাহত রাখুন (আমি এটির জন্য রেজিস্ট্রি ব্যবহার করব)
  • এবং অবশেষে জাভাস্ক্রিপ্ট চালানো।

আমি এটি ধাপে ধাপে বর্ণনা করব, আমি কীভাবে এটি উইন্ডোজ 7 x64 এ , ইন্টারনেট এক্সপ্লোরার 8 এর সাথে কাজ করে পরিচালনা করেছি ... নোট করুন যে আমি অন্যান্য কনফিগারেশনে পরীক্ষা করতে পারিনি। আশা করি আপনি বুঝতে পারবেন =)

একটি ওয়ার্কিং ইন্টারনেট এক্সপ্লোরার 8 অ্যাড-অন তৈরি করা

আমি ভিজ্যুয়াল স্টুডিও 2010 , সি # 4 , নেট ফ্রেমওয়ার্ক 4 ব্যবহার করছি , সুতরাং এর মধ্যে কয়েকটি পদক্ষেপ আপনার জন্য কিছুটা আলাদা হতে পারে।

একটি ক্লাস লাইব্রেরি তৈরি করেছেন। আমি আমার ইন্টারনেটএকপ্লোরার এক্সটেনশনকে ডেকেছি ।

প্রকল্পে এই উল্লেখগুলি যুক্ত করুন:

  • Interop.SHDocVw
  • Microsoft.mshtml

দ্রষ্টব্য: প্রতিটি কম্পিউটারে এই তথ্যসূত্রগুলি বিভিন্ন স্থানে থাকতে পারে।

সিএসপিজে আমার রেফারেন্স বিভাগে এটি রয়েছে:

<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" />

আপডেট হওয়া আই 1111 ফাইলগুলির মতো ফাইলগুলি তৈরি করুন।

IEAddon.cs

আপনি IE11 সংস্করণ থেকে নিম্নলিখিত লাইনগুলিকে uncomment করতে পারেন:

...
// @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

আইই 11 সংস্করণ হিসাবে একই।

এবং অবশেষে একটি ফর্ম, যা আমরা বিকল্পগুলি কনফিগার করতে ব্যবহার করব। এই ফর্মটিতে একটি TextBoxএবং একটি ঠিক রাখুন Button। সেট DialogResult বাটন এর ঠিক আছে । আইই 1111 অ্যাডনের জন্য কোডটি একই।

প্রকল্পের বৈশিষ্ট্যগুলিতে, নিম্নলিখিতগুলি করুন:

  • একটি শক্তিশালী-কি দিয়ে সমাবেশ সাইন ইন;
  • ডিবাগ ট্যাবে সেট এক্সটার্নাল প্রোগ্রাম শুরু করতেC:\Program Files (x86)\Internet Explorer\iexplore.exe
  • ডিবাগ ট্যাবে সেট ব্যবহারযোগ্য কমান্ড লাইন আর্গুমেন্ট থেকেhttp://msdn.microsoft.com/en-us/library/ms976373.aspx#bho_getintouch
  • ইভেন্টগুলি তৈরি করুন ট্যাবে, পোস্ট-বিল্ড ইভেন্ট ইভেন্ট কমান্ড লাইনটি এতে সেট করুন :

    "সি: \ প্রোগ্রাম ফাইলগুলি (x86) \ মাইক্রোসফ্ট এসডিকে \ উইন্ডোজ \ v7.0A \ বিন \ নেটফেক্স Tools.০ সরঞ্জামসমূহ \ x64 \ gacutil.exe" / এফ / আই "Tar (টার্গেটফিরনাম)"
    
    "সি: \ উইন্ডোজ \ মাইক্রোসফ্ট। নেট \ ফ্রেমওয়ার্ক \ v4.0.30319 \ RegAsm.exe" / নিবন্ধভুক্ত "$ (টার্গেটডির) $ (টার্গেটফিলনাম)"
    
    "সি: \ উইন্ডোজ \ মাইক্রোসফ্ট.নেট \ ফ্রেমওয়ার্ক \ v4.0.30319 \ RegAsm.exe" "Tar (টার্গেটডির) $ (টার্গেটফিলনাম)"

মনোযোগ: আমার কম্পিউটারটি এক্স 64 হিসাবে, আমার মেশিনে গ্যাক্টিল এক্সিকিউটেবলের পথের অভ্যন্তরে একটি নির্দিষ্ট x64 রয়েছে যা আপনার চেয়ে আলাদা হতে পারে।

64 বিট আইই 64 বিট-সংকলিত এবং 64 বিবিটি-নিবন্ধিত বিএইচওর প্রয়োজন। 64 বিট RegAsm.exe ব্যবহার করুন (সাধারণত সি: \ উইন্ডোজ \ মাইক্রোসফ্ট.নেট \ ফ্রেমওয়ার্ক 64 4 v4.0.30319 \ RegAsm.exe বাস করে)

এই অ্যাড-অন কীভাবে কাজ করে

এটি সমস্ত ডিওএম ট্রিকে অনুসরণ করে, পাঠ্যটি প্রতিস্থাপন করে, বোতামটি ব্যবহার করে কনফিগার করা হয়েছে, নিজে থেকে একটি হলুদ ব্যাকগ্রাউন্ড রয়েছে। আপনি যদি হলুদ বর্ণগুলিতে ক্লিক করেন তবে এটি জাভাস্ক্রিপ্ট ফাংশনটিকে কল করে যা পৃষ্ঠায় গতিশীলভাবে .োকানো হয়েছিল। ডিফল্ট শব্দটি 'ব্রাউজার', যাতে এটির সাথে অনেকগুলি মেলে! সম্পাদনা করুন: হাইলাইট করার জন্য স্ট্রিংটি পরিবর্তন করার পরে আপনার অবশ্যই ইউআরএল বক্সে ক্লিক করুন এবং এন্টার টিপুন ... এফ 5 কাজ করবে না, আমি মনে করি এটি এফ 5 'ন্যাভিগেশন' হিসাবে বিবেচিত বলে মনে হয়, এবং ইভেন্ট নেভিগেট শোনার প্রয়োজন হবে (হতে পারে). আমি পরে এটি ঠিক করার চেষ্টা করব।

এখন, এটা সময় সময়। আমি খুব ক্লান্ত. প্রশ্ন জিজ্ঞাসা করতে নির্দ্বিধায় ... হতে পারে যেহেতু আমি বেড়াতে যাচ্ছি সেহেতু আমি উত্তর দিতে পারব না ... 3 দিনের মধ্যে আমি ফিরে এসেছি, তবে এর মধ্যে আমি এখানে আসার চেষ্টা করব।


2
হাই, উত্তরে যা বর্ণিত হয়েছে ঠিক তেমনই করেছি। বোতাম প্রদর্শিত হচ্ছে। এক্সিকিউট মজাদার সন্ধান করা হয়। যাইহোক, সেটসাইট এবং গেটসাইট ফাংশনগুলি কখনই ডাকা হয় না। আমি যে পৃষ্ঠায় রয়েছি তার ইউআরএলটি জানতে সক্ষম হতে চাই। ব্রাউজারটি আরম্ভ করার জন্য এই পদ্ধতিগুলি কল করতে ব্যর্থ হচ্ছে .. দয়া করে সহায়তা করুন
মোস্তফাবার

3
আমি IE9 উপর এই কাজ করতে চেষ্টা এবং: 1. আপনার প্রকল্পের পথ স্পেস থাকে: এর পরিবর্তে $(TargetDir)$(TargetFileName)ব্যবহার "$(TargetDir)$(TargetFileName)" 2. আপনি ভিসুয়াল স্টুডিও 2010 এক্সপ্রেস আপনি সম্ভবত (আমি না) দেখতে না ব্যবহার করেন তাহলে স্টার্ট এক্সটার্নাল প্রোগ্রাম ডিবাগ ট্যাবে বিকল্প - আমি কেবল IE চালান এবং প্রদত্ত ইউআরএলটিতে নেভিগেট করুন 3. এটি আই 9 তে কাজ করছে না বলে মনে হচ্ছে - আমি ফর্মটি খুলতে পারি (হাইলাইটার বিকল্পগুলি) তবে কীভাবে এটি পাঠ্যটি হাইলাইট করতে হয় তা আমি জানি না
pinus.acer

8
Interop.SHDocVw রেফারেন্সের জন্য - পরিবর্তে আপনার "মাইক্রোসফ্ট ইন্টারনেট নিয়ন্ত্রণ" এবং তারপরে "SHDocVw ব্যবহার করে" একটি COM রেফারেন্স যুক্ত করা উচিত;
এরিক হার্টফোর্ড

8
"X10 উইন্ডোজ 8-এর আইই 10 আপনার" অ্যাড-অন লোড করবে না যদি না আপনি "যে কোনও সিপিইউ" আর্কিটেকচার দিয়ে তৈরি করেন এবং 32 এবং 64 বিট RegAsm.exe উভয় ব্যবহার করে নিবন্ধন করেন। " এমন একটি সম্পাদনা যা প্রত্যাখাত হয়েছিল।
ম্যাটসেম্যান

3
: দয়া করে ফলো আপ দেখতে stackoverflow.com/questions/22953571/...

12

আর একটি দুর্দান্ত পদ্ধতির পরীক্ষা করা হবে:

http://www.crossrider.org

এটি জেকুরির সাথে জেএস ভিত্তিক একটি কাঠামো যা আপনাকে একক সাধারণ জেএস কোড ব্যবহার করে আইই, এফএফ এবং ক্রোমের জন্য ব্রাউজারগুলির এক্সটেনশানগুলি বিকাশ করতে দেয়। মূলত ফ্রেমওয়ার্কটি সমস্ত কদর্য কাজ করে এবং আপনি আপনার অ্যাপ্লিকেশন কোডটি লেখার জন্য রেখে গেছেন।


হ্যাঁ, এটি সত্যিই যাওয়ার উপায়, পাশাপাশি ভিজ্যুয়াল স্টুডিওতে একটি প্লাগইন বিকাশকারী দুঃস্বপ্ন এড়িয়ে যাওয়া এর অর্থ আপনাকে কেবলমাত্র সমস্ত ব্রাউজারগুলির জন্য একবার আপনার প্লাগইন লিখতে হবে। এর অর্থ হ'ল আপনি যদি একজন ম্যাক ব্যবহারকারী হন তবে ভার্চুয়াল মেশিনে বিকাশ না করা।
opsb

11

আইই এক্সটেনশনের জন্য রাষ্ট্রটি আসলে বেশ দুঃখজনক। আপনার কাছে আই 5 5 ব্রাউজার হেল্পার অবজেক্টের পুরানো মডেল রয়েছে (হ্যাঁ, সেই কুখ্যাত বিএইচওগুলি প্রত্যেকেই প্রত্যাহার করতে ব্লক করতে পছন্দ করেছিল), টুলবার এবং আইই এর জন্য নতুন এক্সিলিটর রয়েছে। তারপরেও সামঞ্জস্যতা মাঝে মাঝে ভেঙে যায়। আমি আই 6 এর জন্য একটি এক্সটেনশন বজায় রেখেছি যা আই 7 এর সাথে ভেঙে গেছে, তাই কিছু জিনিস পরিবর্তিত হয়েছে। বেশিরভাগ ক্ষেত্রে, যতদূর আমি জানি (আমি বছরগুলিতে বিএইচওগুলিকে স্পর্শ করি নি) আপনার এখনও তাদের অ্যাক্টিভ টেম্পলেট লাইব্রেরিগুলি (মাইক্রোসফ্টের সিওএম এর জন্য এসটিএলের মতো ধরণের) ব্যবহার করে কোড করা দরকার এবং এগুলি কেবল সি ++ এর জন্য। আপনি সি # এর সাথে সিওএম ইন্টারপ করতে পারেন এবং সি # তে এটি করে পালিয়ে যেতে পারেন তবে এটির পক্ষে এটির পক্ষে মূল্যবান মূল্য খুব সম্ভবত কঠিন। যাই হোক,

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

এবং আইই 8-তে নতুন যে এক্সিলিটারগুলি আপনি এটি পরীক্ষা করতে পারেন।

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

আমি সম্মত হই যে ডকুমেন্টেশনটি ভয়ানক, এবং API গুলি বেশ পুরানো। তবুও আমি আশা করি এটি সাহায্য করবে।

সম্পাদনা: আমার ধারণা আমি এখানে তথ্যের একটি শেষ উত্স নিক্ষেপ করতে পারি। আমি যখন বিএইচওতে কাজ করছিলাম তখন আমার পিছনের নোটগুলি সন্ধান করছিলাম। এবং এই নিবন্ধটি তাদের সাথে আমার শুরু করল। এটি একপ্রকার পুরানো, তবে এটিএইটিএল ইন্টারফেসগুলির একটি ভাল ব্যাখ্যা রয়েছে যা আপনি আইআইএইচএইচও (উদাহরণস্বরূপ আইওজেক্টভিথসাইট) এর সাথে কাজ করার সময় ব্যবহার করবেন। আমি মনে করি এটি বেশ ভালভাবে ব্যাখ্যা করা হয়েছে এবং তখন আমাকে অনেকটা সাহায্য করেছিল। http://msdn.microsoft.com/en-us/library/bb250436.aspx গ্রেগসি পোস্ট করা উদাহরণটিও আমি যাচাই করেছিলাম। এটি কমপক্ষে IE8 এর সাথে কাজ করে এবং এটি ভিএস ২০১০ এর সাথে সামঞ্জস্যপূর্ণ, সুতরাং আপনি যদি সি # করতে চান তবে আপনি সেখানে শুরু করতে পারেন এবং জোন স্কিটির বইটি একবার দেখে নিতে পারেন। (ডিপোথ ২ য় সংস্করণে সি #) অধ্যায় 13-এ সি # 4 এ থাকা নতুন বৈশিষ্ট্যগুলি সম্পর্কে খুব ভাল তথ্য রয়েছে যা আপনি সিওএম নিকারের সাথে ইন্টারঅ্যাকশন করতে ব্যবহার করতে পারেন। (আমি আপনাকে সি ++ এ আপনার অ্যাডিন করার পরামর্শ দিচ্ছি)


6

সি # বিএইচও-র বিকাশ করা একটি গাধা-বেদনা। এটিতে প্রচুর আইকি সিওএম কোড এবং পি / ইনোভাক কল অন্তর্ভুক্ত রয়েছে।

আমার এখানে বেশিরভাগ সমাপ্ত সি # বিএইচও রয়েছে , যা আপনি যা চান তার জন্য উত্সটি ব্যবহার করতে আপনি মুক্ত । আমি "বেশিরভাগই" বলি কারণ আমি কখনই IE সুরক্ষিত মোডের অধীনে অ্যাপডেটা সংরক্ষণ করব তা বুঝতে পারি নি ।


4
সিএম 4.0 এই ক্ষেত্রে আরও ভাল হতে পারে, কারণ সিওএম ইন্টারপ অনেক উন্নত।
রবার্ট হার্ভে

@ রবার্ট: সত্যি? আমার ধারণা ছিল না ... পার্থক্য কী?
ব্যবহারকারী541686

@ মেহরদাদ: আপনি এখানে পার্থক্যগুলির স্বাদ পেতে পারেন: devx.com/dotnet/Article/42590/1954 । আরও গভীরতর আলোচনার জন্য, অ্যান্ডারস হেজলসবার্গের আলোচনা, "সি ফিউচারের ভবিষ্যত" দেখুন: এখানে চ্যানেল 9.msdn.com/Blogs/pdc2008/TL16
রবার্ট হার্ভে

1
@ রবার্ট @ মেহরদাদ: সত্যই নয়। এটি যে আইওসি (এই বিষয়ে) , এটি সিওএম ইন্টারপ নয় , এটি একটি সিওএম মডিউলটি বিকাশ ও নিবন্ধভুক্ত করছে, যা নতুন সি # 4.0 বৈশিষ্ট্যগুলি সহায়তা করে না।
ব্লুরাজা - ড্যানি পিফ্লুঘুফুট

4

আমি এখন বছরের বহু বছর ধরে আইই এর ওয়েব ব্রাউজার নিয়ন্ত্রণের সাথে কাজ করছি এবং সেগুলি চলাকালীন একটি নাম বার বার সহায়ক পোস্টিংয়ের সাথে আসে: ইগর টান্ডেটনিক

যদি আমি কোনও এক্সটেনশান বিকাশ করে থাকি তবে আমি কোনও বিএইচওকে লক্ষ্য করব এবং এর জন্য গুগলিং শুরু করব:

বিএইচও ইগর তান্ডেটনিক

অথবা

ব্রাউজার হেল্পার অবজেক্ট ইগর টান্ডেটনিক

তার পোস্টিংগুলি প্রায়শই খুব বিশদ হয় এবং তিনি কী জানেন তা তিনি জানেন।

আপনি COM এবং এটিএল প্রোগ্রামিংয়ে নিজেকে নিজের কানের কাছে খুঁজে যাচ্ছেন। একটি নমুনা ওয়াকথ্রু জন্য, দেখুন: http://msdn.microsoft.com/en-us/library/ms976373.aspx


সি # ব্যবহারের সবচেয়ে বড় নেতিবাচক দিক (যা অন্যান্য পোস্টারগুলির মধ্যে বেশিরভাগ দিকে যাচ্ছে সে দিকটি হ'ল) ​​এটি সি ++ এর স্থানীয় হবে এমন কোডের জন্য ওয়ার্কআউন্ড এবং প্যাচ সহ সমস্ত প্রকারের অতিরিক্ত স্তর দিয়ে যাচ্ছে।
লিন ক্র্যাম্বলিং

3

আমি রবার্ট হার্ভির সাথে একমত, সি # 4.0 বৈশিষ্ট্যযুক্ত সিওএম ইন্টারপ উন্নত করেছে। পুনরায় লেখার মরিয়া প্রয়োজনে এখানে কিছুটা পুরনো সি # কোড।

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

এটিএটিএল এড়িয়ে স্পার্টান সিওএম এর সাথে যাচাই করে জিনিসগুলি সহজ করার প্রয়াস:

বিএইচওগুলি পেতে সি ++ এবং সিওএম


3

আপনি যদি চক্রটি পুনরায় উদ্ভাবনের চেষ্টা না করে থাকেন তবে আপনি IE এর জন্য অ্যাড ইন এক্সপ্রেস চেষ্টা করতে পারেন । আমি ভিএসটিও স্টাফের জন্য পণ্যটি ব্যবহার করেছি এবং এটি বেশ ভাল। এছাড়াও তাদের একটি সহায়ক ফোরাম এবং দ্রুত সমর্থন রয়েছে।


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

এটি ব্যান্ড অবজেক্টের ব্যবহারের ভিত্তিতে এবং। নেট 2.0 ব্যবহার করে সংকলিত হয়েছে। সোর্স কোডটি সরবরাহ করা হয়েছে এবং ভিজ্যুয়াল স্টুডিও 2013 এর সাথে খোলে এবং সংকলন করে। 11 উপভোগ করুন!


আমরা স্ট্যাক ওভারফ্লোতে স্ব অন্তর্ভুক্ত থাকতে চাই। এই সমস্ত পোস্টটি আমাকে সত্যিই বলেছে "ব্যান্ড অবজেক্টস এবং। নেট 2.0" ব্যবহার করুন। কীভাবে এটি করা যেতে পারে তা দেখানোর জন্য আপনি এখানে কিছু নমুনা কোড অন্তর্ভুক্ত করতে পারেন?
Teepeemm

0

প্রশ্নটি ২০১৩ সালের, এখন এটি ২০২০, তবে এটি ভবিষ্যতের দর্শকদের জন্য সহায়ক হতে পারে।

আমি @ মিগুয়েল অ্যাঞ্জেলোর উত্তরটি কার্যকর করার চেষ্টা করেছি, এটি শুরুতে কার্যকর হয়নি।

এখনও কিছু সেটিংস যা আপনাকে সংজ্ঞায়িত করা হয়েছে।

ইন্টারনেট এক্সপ্লোরার (আমি IE-11 ব্যবহার করছি) এ যান Tools-->Internet Options-->Advanced: এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন

আরো দেখুন এই তাই প্রশ্ন এবং 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)"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.