Получая URL и HTMl через BHO, SetSite выдает исключение - PullRequest
0 голосов
/ 07 ноября 2011

Я выполнил учебник по адресу: http://www.15seconds.com/issue/040331.htm для создания BHO, однако мне кажется, что он мне не подходит, у меня есть код Observer из экзамена, где она создает фактическое BHO, но когда я пытаюсьдля того, чтобы вписать в мой SetSite, он останавливается, я подозреваю, что я получаю исключение.

Это мой пример кода, только что он был полностью разобран, поэтому вместо этого я получаю окно сообщения.

[ClassInterfaceAttribute(ClassInterfaceType.None)]
    [GuidAttribute("0CD00297-9A19-4698-AEF1-682FBE9FE88D")]
    [ProgIdAttribute("Observer.BrowserMonitor")]
    public class BrowserMonitor: IObserver, IObjectWithSite
    {

        // HRESULT values used
        const int E_FAIL = unchecked((int)0x80004005);
        const int E_NOINTERFACE = unchecked((int)0x80004002);

        public BrowserMonitor()
        {

        }


        protected SHDocVw.IWebBrowser2 m_pIWebBrowser2; // the browser class object

        public void SetSite(object pUnkSite)
        {
            System.Windows.Forms.MessageBox.Show(pUnkSite.ToString());
            if (pUnkSite != null)
            {
                m_pIWebBrowser2 = pUnkSite as SHDocVw.IWebBrowser2;
            }
        }

        public void GetSite(ref System.Guid riid, out object ppvSite)
        {            
            System.Windows.Forms.MessageBox.Show("GetSite");
            ppvSite = null;
        }

        protected void DocumentComplete(object pDisp, ref object URL)
        {            
            System.Windows.Forms.MessageBox.Show("DocumentComplete");

        }

        protected bool ServiceEnabled()
        {
            return true;
        }

        protected void Release()
        {
            System.Windows.Forms.MessageBox.Show("Release");
        }

        protected void BeforeNavigate2(object pDisp, ref object url, ref object Flags, ref object TargetFrameName, 
            ref object PostData, ref object Headers, ref bool Cancel)
        {
            System.Windows.Forms.MessageBox.Show("BeforeNavigate2");
        }

        protected void OnQuit() 
        {
            try
            {
                System.Windows.Forms.MessageBox.Show("OnQuit");
            }
            catch{}
        }

        protected void NavigateComplete2(object pDisp, ref object URL)
        {
            System.Windows.Forms.MessageBox.Show("NavigationComplete2");            
        }

Моя проблема в моем методе SetSite, как мне настроить тип любого браузера?Если я запускаю этот пример, как сейчас, я получаю только окно сообщения «GetSite», если я удаляю предложение if в SetSite, я также получаю SetSite.Кто-нибудь знает, как это сделать?

1 Ответ

1 голос
/ 07 ноября 2011
  1. (Не важно, чтобы ответить) Вы действительно не должны писать BHO на C #. Да, это может быть сделано, но это не очень хорошая идея. Даже с SxS в .NET 4; стоимость инициализации CLR для каждой открытой вкладки довольно высока. (Если вы настаиваете, вы должны хотя бы использовать .NET 4).

  2. Методы сайта Get / Set должны возвращать int в соответствии с документацией для IObjectWithSite. Неверное объявление вашего интерфейса.

  3. Ваша реализация GetSite должна выглядеть примерно так, как только вы исправите интерфейс:

    public int GetSite(ref Guid riid, out IntPtr ppvSite)
    {
        var pUnk = Marshal.GetIUnknownForObject(_pUnkSite);
        try
        {
            return Marshal.QueryInterface(pUnk, ref riid, out ppvSite);
        }
        finally
        {
            Marshal.Release(pUnk);
        }
    }
    

    В этом случае _pUnkSite - это объект, который вам дали на SetSite. Так что SetSite будет выглядеть примерно так:

    private object _pUnkSite;
    public int SetSite(object pUnkSite)
    {
        _pUnkSite = pUnkSite;
        //Cast pUnkSite to `IWebBrowser2` here and attach events.
        return 0;
    }
    

    Как только вы, наконец, позаботились о некотором шаблонном коде, вы можете привести pUnkSite к чему-то вроде IWebBrowser2 для работы с DOM.

  4. Я знаю, что написание C # BHO - плохая идея , потому что я сделал это . У меня есть шаблонный проект GitHub здесь .

...