在获取IWebBrowser2接口后,我使用CreateDialog在SetSite方法中创建无模式对话框。对话框资源位于BHO dll中。当创建IE的新实例(我的意思是doble单击IE快捷方式)时,创建成功但是当我创建新选项卡时创建失败(但在其他计算机中它成功)。还有一些奇怪的事情是,有时候创建一个新的选项卡也会创建一个新的IE进程但有时却不会。
这是对话框创建的代码:
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 :(得分:0)
似乎根本原因是第三个参数hWndParent。当我将其设置为NULL时,此问题消失。我认为IE选项卡的新进程无法访问IE主窗口句柄,因此错误代码为5。