2017-08-05 87 views
0

我在简单的一个主窗口测试应用程序中使用从https://stackoverflow.com/a/21699086/592212略有修改IDocHostUIHandler只有WPF WebBrowser组件在该窗口中。初始化代码如下:IDocHostUIHandler崩溃MSHTML.dll错误0xc0000409

public MainWindow() 
    { 
     InitializeComponent(); 

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

     PART_WebBrowser.Navigate("SOME_URL"); 
    } 

在应用程序中确实没有其他的事情发生。但是,在运行应用程序之后,COM组件中会抛出错误(因此,我无法使用调试器来捕获它),并且在事件查看器中报告0xc0000409(STATUS_STACK_BUFFER_OVERRUN)。

什么是造成错误或如何摆脱它的任何想法?

(Win10临1703(建15063.483)和.NET 4.6.2)

源代码:https://www.dropbox.com/s/ddob6p7jh4dfsda/UIHostCrashDemo.zip?dl=1

+0

那么,那低投票的解决方案应该开始寻找更有吸引力:) –

+0

@HansPassant你的意思是什么解决方案? –

+0

矿山,在链接的Q + A的底部。成千上万的程序员使用的代码总是有较少的问题。 –

回答

0

我不知道从何处取得您的WebBrowserHostUIHandler.cs内容,但它错误IDocHostUIHandler的定义简单地忽略了TranslateAccelerator方法。

我想这是因为我的初始代码使用System.Windows.Forms.Message类型,它是对System.Windows.Forms(winforms)程序集的引用。如果这是一个这样的问题,那么如果不使用这个消息(这在我的初始代码中就是这种情况),这个方法可以被这个代替。

所以在界面,你必须添加这个,只是ResizeBorder后:

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

而且你必须在代码的任何地方实现它,像这样:

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

但同样,这是可选,如果你想要的东西只是从我的帖子仔细复制/粘贴我的代码,并添加一个对System.Windows.Forms的引用(如果需要的话)。

+0

谢谢你的回答。有趣的是,那是你在那个例子中的代码,但我不知道它是如何从接口中丢失该方法的。否则,它是相同的,只有编码风格被改变,以适应我的其他代码。尽管这是对我原来的问题(它不会崩溃了)的答案,但它并不能解决我的问题,因为高DPI支持是一团糟,并且呈现适当的大小时,它无法正确呈现。因此,我必须坚持在Win10的最后一个IE版本中使用过时的工作模式,即“FEATURE_96DPI_PIXEL”。 –