2014-03-27 58 views
0

在獲取IWebBrowser2接口後,我使用CreateDialog在SetSite方法中創建一個無模式對話框。對話框資源位於BHO dll中。當創建IE的新實例(我的意思是可點擊IE快捷方式)的IE創建成功,但是當我創建一個新的選項卡創建失敗(但在其他計算機,它是成功的)。還有一點奇怪的是,有時創建一個新標籤頁也會創建一個新的IE進程,但有時不會。爲什麼CreateDialog在BHO中出現錯誤代碼5失敗?

這是對話創造代碼:

bool MyDialog::Create(MyContext *ls) 
{ 
    extern HINSTANCE hInstance; // handle of BHO dll 
    m_hDialog = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_MYDLG),ls->GetBrowserMainWnd(), MyDlgProc); 

    if (m_hDialog) { 
     SetWindowLong(m_hDialog, GWL_USERDATA, (LONG)ls); 
     SetTimer(m_hDialog, 1, 1000, NULL); 
     return true; 
    } 
    return false; 
} 

我覺得這事做對話建立在不同的UI線程,但不知道這一點。希望有人能幫助我解決這個問題。非常感謝!

更新2014-03-31:

的GetBrowserMainWnd方法調用IWebBrowser2-> get_HWND讓主窗口的句柄。但是對於IE7和後來引入的選項卡式窗口使事情變得複雜,如MSDN的描述:

「Internet Explorer 7.隨着標籤式瀏覽的引入,此方法的返回值可能不明確,爲了減輕混淆並保持最高級別與現有應用程序的兼容性,此方法返回頂層窗口框架的句柄,而不是當前選定的選項卡。「

所以,我用示例代碼(參考http://msdn.microsoft.com/en-us/library/aa752126(v=vs.85).aspx)解決了這個問題。

+0

'CreateDialog'在失敗時返回'NULL',您是否從'GetLastError()'獲得5?你沒有在你的問題中提到這一點。 – sashoalm

+0

是的錯誤代碼來自GetLastError()。 – Kery

回答

0

看來,根本原因是第三個參數hWndParent。當我將它設置爲NULL時,此問題消失。我認爲IE選項卡的新進程無法訪問IE主窗口句柄,因此失敗,錯誤代碼爲5.

+1

錯誤代碼5是「訪問被拒絕」。您可能會受到Internet Explorer的流程強化機制的阻礙,並且無法從其窗口創建子窗口。 – selbie

+0

是的,我認爲是。你能解釋一下什麼是流程強化機制?提前致謝! – Kery

相關問題