【问题标题】:Open URL in new tab (Internet Explorer)在新选项卡中打开 URL (Internet Explorer)
【发布时间】:2013-08-09 14:00:37
【问题描述】:

我正在为 Internet Explorer 开发自定义工具栏(添加了一个工具栏按钮)。 我在 COM 中编写了代码。 当用户单击我的工具栏按钮时,我需要在新选项卡中打开一个 URL。我编写了如下导航功能。此函数在新标签页中打开 URL 失败,总是返回 E_FAIL。

HRESUTL Navigate(CString csUrl) {
ATLASSERT(0 <= Url.Length());
ATLASSERT(m_pWebBrowser);

if (m_pWebBrowser == NULL) {
    return E_FAIL;
}

m_pWebBrowser->Stop();

VARIANT vUrl;
vUrl.vt = VT_BSTR;
vUrl.bstrVal = csUrl.AllocSysString();

VARIANT vFlag;
vFlag.vt = VT_I4;
vFlag.intVal = navOpenInNewTab;

VARIANT vEmpty;
VariantInit(&vEmpty);

HRESULT hr = m_pWebBrowser->Navigate2(&vUrl, &vFlag, &vEmpty, &vEmpty, &vEmpty);

if (hr == E_OUTOFMEMORY)
    MessageBox(NULL, L"Out of Memory.", L"Navigate", MB_OK);
else if (hr == E_INVALIDARG || hr == E_FAIL)
    MessageBox(NULL, L"Failed to navigate.", L"Navigate", MB_OK);

::SysFreeString(vUrl.bstrVal);

ATLASSERT(SUCCEEDED(hr));

return hr; }

我需要为“Navigate2”方法传递哪些参数才能在新标签页中打开 URL。

请在这方面给我建议。

问候, 桑托什

【问题讨论】:

  • 您应该在顶级浏览器对象 (SID_STopLevelBrowser) 上调用 Navigate。回答了类似的问题here
  • 我尝试使用顶级浏览器对象。还是同样的问题。我正在使用 IE 8。
  • @Noseratio 我按照您的建议尝试了获取顶级浏览器对象。但仍然是同样的问题。我正在使用 IE 8。
  • 您的分机是 BHO 吗?您首先如何获得m_pWebBrowser?显示更多代码。

标签: c++ visual-c++


【解决方案1】:

我正在为 IE 创建工具栏。

这是我的 SetSite 方法

HRESULT CMyClass::SetupBrowser(IUnknown* pUnkSite) {
ATLASSERT(pUnkSite);
HRESULT hr = E_FAIL;

IOleCommandTarget* pCmdTarget = NULL;   
if (SUCCEEDED(pUnkSite->QueryInterface(IID_IOleCommandTarget,
                        (LPVOID*)&pCmdTarget)) && NULL != pCmdTarget) {
    IServiceProvider* pSP = NULL;
    if (SUCCEEDED(pCmdTarget->QueryInterface(IID_IServiceProvider,
                                (LPVOID*)&pSP)) && NULL != pSP) {
        CComPtr<IServiceProvider> child_provider;
        hr = pSP->QueryService(SID_STopLevelBrowser,
                               IID_IServiceProvider,
                               reinterpret_cast<void**>(&child_provider));
        if (SUCCEEDED(hr)) {
            hr = child_provider->QueryService(SID_SWebBrowserApp,
                                              IID_IWebBrowser2,
                                              reinterpret_cast<void**>(&m_pWebBrowser));
        }

        /*hr = pSP->QueryService(SID_SWebBrowserApp,
                                IID_IWebBrowser2,
                                (LPVOID*)&m_pWebBrowser);*/
        ATLASSERT(m_pWebBrowser);
        pSP->Release();
    }
    pCmdTarget->Release();
}

m_ReflectWnd.GetToolBar().SetBrowser(m_pWebBrowser);

return hr; }

【讨论】:

  • 编辑原始问题并在那里添加代码会更合适。无论如何,代码似乎是正确的,我无法发现问题。如果你使用navOpenInNewWindow,它是打开一个新窗口还是仍然返回E_FAIL
  • 对此感到抱歉。是的,如果我使用 navOpenInNewWindow,它会返回 E_FAIL。
  • 我可以使用 javascript 在新选项卡中打开 URL 并且可以从我的本机代码执行吗?只是一个想法。
  • 您可以通过将一些 JavaScript 注入当前文档(通过 IWebBrowser2::get_Document)。在你走那条路之前,你能检查一下IWebBrowser2::get_FullName的值吗,里面有“iexplore.exe”吗?另外,您是否在另一台机器上尝试过您的 IE 扩展程序?
  • @Noseratio,感谢您的帮助。为了解决这个问题,我使用了 ShellExecute 来导航 URL。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-15
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
  • 2020-12-26
  • 1970-01-01
相关资源
最近更新 更多