2014-02-28 11 views
5

Ich stelle einen benutzerdefinierten Namespace und binäres Verhalten für ein .net WebBrowser-Steuerelement bereit, und es funktioniert unter bestimmten Umständen problemlos. Verwendung des folgenden Codes, die Haltepunkte (gekennzeichnet mit ) alle Treffer und mein Namespace richtig komplett mit dem Verhalten implementiert:IServiceProvider IElementBehaviorFactory wird nicht abgefragt, bis ein unbehandelter JavaScript-Fehler ausgelöst wird

int IServiceProvider.QueryService(ref Guid guidService, ref Guid riid, out IntPtr ppvObject) 
{ 
    int hr = Native.E_NOINTERFACE; 
    ppvObject = IntPtr.Zero; 

    if (riid == IidClsid.IID_IElementBehaviorFactory) 
    { 
     // Returning S_OK tells the html host to query for our IHostBehaviorInit. 
●  hr = Native.S_OK; 
    } 
    else if (riid == IidClsid.IID_IHostBehaviorInit) 
    { 
     ppvObject = Marshal.GetComInterfaceForObject(this, typeof(IHostBehaviorInit)); 
●  hr = Native.S_OK; 
    } 
    else if (guidService == IidClsid.IID_IInternetSecurityManager) 
    { 
     ppvObject = Marshal.GetComInterfaceForObject(this, typeof(IInternetSecurityManager)); 
●  hr = Native.S_OK; 
    } 
    return hr; 
} 

jedoch die erste und die zweite Haltepunkt nur wegen eines Skriptfehler in der Testseite . Wenn ich den Fehler behebe oder Fehler unterdrücke, treffen die Breakpoints niemals. Zum Beispiel verhindert, dass der folgende Code meines Namensraum und Verhalten von je registriert werden:

WebBrowser.Document.Window.Error += OnWebBrowserDocumentWindowError; 

public void OnWebBrowserDocumentWindowError (object sender, IHTMLEventObj e) 
{ 
    e.Handled = true; 
} 

Dies ist, was die MSDN documentation for IHostBehaviorInit sagt:

MSHTML ruft die IServiceProvider::QueryService der Hostanwendung um die IElementBehaviorFactory Schnittstelle anzufordern, und fordert den Host für die IHostBehaviorInit Schnittstelle. Wenn die Schnittstelle IHostBehaviorInit verfügbar ist, ruft MSHTML die IHostBehaviorInit::PopulateNamespaceTable-Methode auf. Die Hostanwendung kann dann MSHTML für die Schnittstelle IElementNamespaceTable abfragen und die Methode IElementNamespaceTable::AddNamespace verwenden, um zusätzliche Namespaces an die Namespacetabelle anzufügen.

Ich habe bemerkt, dass, wenn ich auf einem <select> klicken Sie auf den Dropdown-Liste zu öffnen, die ersten und zweiten Haltepunkte ganz plötzlich treffen. Es ist wirklich komisches Verhalten, kann mir jemand helfen, das herauszufinden?

+0

Was ist die IE-Version und was ist der Wert von 'FEATURE_BROWSER_EMULATION', falls vorhanden? Haben Sie versucht, 'FEATURE_BEHAVIORS' zu deaktivieren (auf '0' setzen)? – Noseratio

+0

@Noseratio: IE-Version ist 10, aber der Dokumentmodus ist IE 7. 'FEATURE_BROWSER_EMULATION' ist für diese Anwendung (aus Kompatibilitätsgründen) auf' 7000' gesetzt. 'FEATURE_BEHAVIORS' ist auf' 1' (Standard) eingestellt, aber das Ändern in '0' macht keinen Unterschied. –

+0

Andy, Sie möchten dies möglicherweise als Fehler an Microsoft melden, obwohl es wahrscheinlich nicht behoben wird. Sie ignorieren Binärverhalten seit IE10, die Unterstützung dafür ist in IE11 noch schlimmer. – Noseratio

Antwort

2

Dies kann die Frage nicht direkt beantworten, aber es ist zu lang für einen einfachen Kommentar.

Warum vergleichen Sie riid anstatt guidService in den ersten beiden Fällen? Sieht für mich wie ein Fehler aus, benutze stattdessen guidService.

Weiter, sobald Sie den Service angefordert haben, sollten Sie nicht Marshal.GetComInterfaceForObject verwenden, weil riid und guidService abweichen können. Verwenden Sie stattdessen Marshal.GetIUnknownForObject und Marshal.QueryInterface:

IntPtr unk = Marshal.GetIUnknownForObject(this); 
try 
{ 
    return Marshal.QueryInterface(unk, ref riid, out ppvObject); 
} 
finally 
{ 
    Marshal.Release(unk); 
} 

Auch so, wie Sie implementieren Ihre IServiceProvider beeinflussen können, wie MSHTML es nimmt auf. Ich schlage vor, Sie verwenden IProfferService dafür. Ich habe ein vollwertiges Beispiel für die Verwendung von IProfferService mit WebBrowserhere.

+0

+1, danke, ich habe die Änderungen vorgenommen, die Sie empfohlen haben. Ich spielte mit den 'rid' /' guidService'-Vars herum und vergaß, sie wieder zu ändern, bevor ich diese Frage stellte. –

+0

@AndyE, überprüfen Sie mein Update auf 'IServiceProvider'. – Noseratio

+0

interessant, werde ich das überprüfen, wenn ich eine Chance bekomme und zu dir zurückkomme. –