2013-03-20 4 views
3

я создал производное управление от WebBrowser управления, который имеет собственной IDocHostUIHandler реализации следующую идею от CreateWebBrowserSiteBase метода:Почему моя реализация IDocHostUIHandler игнорируется

Класса WebBrowser.WebBrowserSite обеспечивает реализацию по умолчанию интерфейса OLE IDocHostUIHandler. Вы можете предоставить свою собственную реализацию или реализовать любой другой интерфейс управления WebBrowser ActiveX, чтобы настроить поведение элемента управления .

Проблема, которая не работает. Мой код выглядит следующий путь:

[PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")] 
public MyBrowser(){} 

protected override WebBrowserSiteBase CreateWebBrowserSiteBase() 
{ 
    var manager = new NewWebBrowserSite(this); 
    return manager; 
} 

protected class NewWebBrowserSite : WebBrowserSite, 
    UnsafeNativeMethods.IDocHostUIHandler 
{ 
    private MyBrowser host; 
    public NewWebBrowserSite(MyBrowser h) 
     : base(h) 
    { 
     this.host = h; 
    } 

    int UnsafeNativeMethods.IDocHostUIHandler.ShowContextMenu(int dwID, NativeMethods.POINT pt, object pcmdtReserved, object pdispReserved) 
    { 
     MyBrowser wb = (MyBrowser)this.host; 
     // other code 
    } 

    // rest of IDocHostUIHandler methods 
} 

Мои вопросы:

  1. Должен ли я реализовать другие интерфейсы, чтобы сделать его работу;
  2. Это дизайн, я прочитал некоторые post, что это связано с ошибкой в ​​.NET Framework реализации WebBrowser

Я знаю, что можно пойти ICustomDoc.SetUIHandler путь, но это не то, что я находясь в поиске.

У меня возникла идея в какой-то момент отказаться от C# и сделать это с неуправляемым кодом. Это так?

ответ

1

Вы не можете просто переопределить интерфейсы, реализованные классом. Если методы для IDocHostUIHandler не отмечены как виртуальные, их нельзя заменить.

Тот факт, что интерфейс определен в UnsafeNativeMethods, также является ключом к тому, что вы, вероятно, не должны возиться с ним, если у вас нет очень хорошего представления о том, что вы делаете.

+0

хороший момент, http://msdn.microsoft.com/en-us/library/aa664593(v=vs.71).aspx – walter

4

Я только что рассмотрел точно такую ​​же проблему: как обеспечить пользовательскую реализацию IDocHostUIHandler WinForms WebBrowser. Проблема в том, что базовый класс WebBrowserSite уже реализовал свою собственную версию IDocHostUIHandler (которая является интерфейсом internal, поэтому это невозможно для explicitly re-implement в производном классе NewWebBrowserSite). Однако теоретически не должно возникнуть проблемы с внедрением другого интерфейса C# с тем же макетом GIID и методов (поскольку в этом конкретном случае это касается всего COM-клиента - базового элемента управления ActiveX WebBrowser).

К сожалению, это было невозможно до .NET 4.0. К счастью, теперь, с помощью новой функции ICustomQueryInterface:

protected class NewWebBrowserSite : WebBrowserSite, 
    UnsafeNativeMethods.IDocHostUIHandler 
    ICustomQueryInterface 
{ 
    private MyBrowser host; 
    public NewWebBrowserSite(MyBrowser h): base(h) 
    { 
     this.host = h; 
    } 

    int UnsafeNativeMethods.IDocHostUIHandler.ShowContextMenu(int dwID, NativeMethods.POINT pt, object pcmdtReserved, object pdispReserved) 
    { 
     MyBrowser wb = (MyBrowser)this.host; 
     // other code 
    } 

    // rest of IDocHostUIHandler methods 

    // ICustomQueryInterface 

    public CustomQueryInterfaceResult GetInterface(ref Guid iid, out IntPtr ppv) 
    { 
     if (iid == typeof(UnsafeNativeMethods.IDocHostUIHandler).GUID) 
     { 
      ppv = Marshal.GetComInterfaceForObject(this, typeof(UnsafeNativeMethods.IDocHostUIHandler), CustomQueryInterfaceMode.Ignore); 
     } 
     else 
     { 
      ppv = IntPtr.Zero; 
      return CustomQueryInterfaceResult.NotHandled; 
     } 
     return CustomQueryInterfaceResult.Handled; 
    } 
} 
Смежные вопросы