为什么CreateDialog在BHO中失败并显示错误代码5?

时间:2014-03-27 09:47:20

标签: c++ windows internet-explorer winapi bho

在获取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)解决了这个问题。

1 个答案:

答案 0 :(得分:0)

似乎根本原因是第三个参数hWndParent。当我将其设置为NULL时,此问题消失。我认为IE选项卡的新进程无法访问IE主窗口句柄,因此错误代码为5。