在IE9中从BHO读取JS变量

时间:2011-03-01 11:12:06

标签: windows com ole bho internet-explorer-9

我有一个Internet Explorer BHO,它可以在当前网站上执行脚本,然后读取在该脚本中分配的变量。不幸的是,从IE9开始(我用RC测试过),读取JS变量导致HRESULT 0x80020006。

脚本集按如下方式分配JS变量:

this.<js_var> = <value>

其中this是当前的Window对象。它使用

执行
hr = pWindow->execScript( ccom_js, lang, &vEmpty );

并使用

读取JS变量
bool get_js_var( CComPtr<IDispatch> pDisp, LPOLESTR name, VARIANT *dest )
{
  DISPID id;
  HRESULT hr = pDisp->GetIDsOfNames( IID_NULL, &name, 1, LOCALE_SYSTEM_DEFAULT, &id );
  if ( SUCCEEDED( hr ) ) {
    VariantInit( dest );
    VariantClear( dest );
    DISPPARAMS dp = { 0, 0, 0, 0 };
    hr = pDisp->Invoke( id, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &dp, dest, NULL, NULL );
    if ( SUCCEEDED( hr ) ) {
      return true;
    } else {
      LOG( _T( "failed to get var contents, hresult = 0x%lx" ), hr );
    }
  } else {
    LOG( _T( "failed to get id of var name, hresult = 0x%lx" ), hr );
  }

  return false;
}

使用pDisp检索document->get_Script( &pDisp );

此代码在以前版本的IE中,在Windows XP,Vista和7上运行良好。在IE9中,脚本执行(我可以调用警报等),但无法读取变量。 IE9中的哪些变化会导致此问题?

1 个答案:

答案 0 :(得分:3)

虽然IDispatch->GetIDsOfNames()未能在IE9中获取变量的Dispatch ID,但结果是get_Script()的结果为IDispatchEx而不是IDispatch并且调用:

HRESULT hr = pDispEx->GetDispID( CComBSTR( name ), fdexNameImplicit, &id );

而不是

RESULT hr = pDisp->GetIDsOfNames( IID_NULL, &name, 1, LOCALE_SYSTEM_DEFAULT, &id );

会导致有效且可用的ID与pDispEx->Invoke()一起使用。

要获得IDispatchEx指针,我使用了:

CComPtr<IDispatchEx> pDispEx;
hr = pDisp->QueryInterface(IID_IDispatchEx, (void**)&pDispEx);`