IDocHostUIHandler crashing MSHTML.dll with error 0

2019-06-13 01:56发布

问题:

I am using slightly modified IDocHostUIHandler from https://stackoverflow.com/a/21699086/592212 in simple one main window test application with only WPF WebBrowser component in that Window. The initialization code is as follows:

    public MainWindow()
    {
        InitializeComponent();

        _wbHostHandler = new WebBrowserHostUIHandler(PART_WebBrowser);
        _wbHostHandler.Flags |= HostUIFlags.DpiAware;

        PART_WebBrowser.Navigate("SOME_URL");
    }

There is really nothing else going on in the Application. Still, after running the application, an error is thrown in COM component (therefore, I can not use a debugger to trap it) and 0xc0000409 (STATUS_STACK_BUFFER_OVERRUN) is reported in Event Viewer.

Any ideas of what is causing the error or how to get rid of it?

(Win10 Pro 1703 (build 15063.483) and .NET 4.6.2)

Source Code: https://www.dropbox.com/s/ddob6p7jh4dfsda/UIHostCrashDemo.zip?dl=1

回答1:

I don't know where you got your WebBrowserHostUIHandler.cs content from but it's wrong. The definition of IDocHostUIHandler simply misses the TranslateAccelerator method.

I guess it's because my initial code used System.Windows.Forms.Message type which is a reference to the System.Windows.Forms (winforms) assembly. If this is such a problem, the method can just be replaced by this if the message is not used (wich is the case in my initial code).

So in the interface you must add this, just after ResizeBorder:

[PreserveSig]
uint TranslateAccelerator(IntPtr msg, ref Guid group, int nCmdID);

And you must implement it anywhere in the code, like this:

uint Native.IDocHostUIHandler.TranslateAccelerator(IntPtr msg, ref Guid group, int nCmdID)
{
    return S_FALSE;
}

But again, this is optional, if you want something that works just carefully copy/paste my code from my post and add a reference to System.Windows.Forms if needed.