在獲取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)解決了這個問題。
'CreateDialog'在失敗時返回'NULL',您是否從'GetLastError()'獲得5?你沒有在你的問題中提到這一點。 – sashoalm
是的錯誤代碼來自GetLastError()。 – Kery