【发布时间】:2014-05-06 04:45:18
【问题描述】:
得到IWebBrowser2接口后,我使用CreateDialog在SetSite方法中创建了一个无模式对话框。对话框资源位于 BHO dll 中。创建 IE 的新实例(我的意思是双击 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 年 3 月 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?你没有在你的问题中提到这一点。 -
是的,错误代码来自 GetLastError()。
标签: c++ windows internet-explorer winapi bho