【问题标题】:Why CreateDialog failed with error code 5 in BHO?为什么 CreateDialog 在 BHO 中失败,错误代码为 5?
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 错误代码 5 是“拒绝访问”。您可能会受到 Internet Explorer 的进程强化机制的阻碍,并阻止您在其窗口之外创建子窗口。
  • 是的,我想是的。您能否解释一下流程强化机制是什么?提前致谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-07
  • 2021-12-26
  • 1970-01-01
  • 2018-11-29
  • 1970-01-01
  • 2021-08-16
  • 1970-01-01
相关资源
最近更新 更多