我有一个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);`