【问题标题】:IE9 GetPropertyByName failingIE9 GetPropertyByName 失败
【发布时间】:2013-08-05 18:59:29
【问题描述】:

您好,我们在不兼容模式下使用 IE9。

我们正在做这样的事情来从浏览器端读取 JS 变量值:

ComPtr<IDispatch> disp;
m_spBrowser->get_Document(&disp);

CComQIPtr<IHTMLDocument2> htmlDoc = disp;
if( !htmlDoc ) return ZString();

CComPtr<IHTMLWindow2> spWindow;
htmlDoc->get_parentWindow(&spWindow);

CComVariant varRes;
CComDispatchDriver dispWindow = spWindow;
if( dispWindow ) {
    HRESULT hr = dispWindow.GetPropertyByName(L"returnValue", &varRes);
    if( SUCCEEDED(hr) && SUCCEEDED(varRes.ChangeType(VT_BSTR)) ) 
        return CString(varRes.bstrVal);
}
return CString();

我们使用的是旧版本的 ATL。

现在这个例程在 IE9 不兼容模式下运行时总是失败。 “returnValue”为 Null,我们得到 GetLastError 的 0 值。

有什么想法吗?这是一个已知问题吗?如果有,有什么修复/解决方法吗?

【问题讨论】:

  • 我们希望从 C++ 端获取 window.top.returnValue 并访问 JS 变量。如果有帮助,我们正在使用 MSVC 6 ATL。
  • 检查this 以获取IDispatchEx::GetDispIDwindow 对象上的示例。

标签: javascript c++ com internet-explorer-9 atl


【解决方案1】:

您在这里所做的是从 COM 对象中查询名为 returnValue 的属性,您有 IHTMLWindow2 接口指针。这不必解决,因为您假设该属性存在,并且文档另有说明:

returnValue property:

备注

此属性应用于使用 IHTMLWindow2::showModalDialog 方法。

更重要的是,该属性属于IHTMLDialog 接口,因此您也许可以直接访问它,而无需依赖CComDispatchDriver 的能力通过IDispatch/IDispatchExnamed 属性访问找到它的路径。

【讨论】:

  • 我们将JS对象的值设置为window.top.returnValue=。根据您的逻辑,所有浏览器的代码都会失败......不仅仅是IE9。另外,为什么我会得到错误值 0(操作成功完成)?
  • 1 我的逻辑是,您可能会更准确地获取该属性,而不是期望通过名称查找找到该属性 2 GetLastError 预计不会在此处为您提供任何错误代码,而是您需要进入该功能并检查那里的东西。 hr 可能有相关的错误代码。
  • 知道如何在上述代码/函数中获取 IHTMLDialog 对象吗?我正在从其他地方创建模态对话框,我只需要从上面的函数中读取 returnValue 属性。也可能是 ATL 3.0 的限制,因为所有其他浏览器/平台都可以正常工作..
  • 所以我尝试了这个但不起作用(在 QueryInterface 出现错误) ComPtr spWindow; htmlDoc->get_parentWindow(&spWindow); hr = spWindow->get_external(&disp); CComQIPtr spDlg; hr = disp->QueryInterface(IID_IHTMLDialog , (void **) &spDlg);
猜你喜欢
  • 2014-07-01
  • 2011-08-07
  • 2012-02-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 2011-11-18
相关资源
最近更新 更多