在IE9中读BHO的JSvariables

我有一个Internet Explorer BHO,可以在当前网站上执行一个脚本,然后读取已在该脚本中分配的variables。 不幸的是,截至IE9(我与RCtesting),阅读JSvariables导致HRESULT 0x80020006。

脚本集分配JSvariables如下:

this.<js_var> = <value> 

this是当前的Window对象。 它使用执行

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

并使用JS读取variables

 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 );检索document->get_Script( &pDisp );

此代码在以前版本的IE,Windows XP,Vista和7中工作正常。在IE9脚本执行(我可以调用警报等),但variables不能被读取。 IE9中的哪些变化导致了这个问题?

虽然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);`