2017-08-05 90 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」。 –