我有一个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中的哪些变化会导致此问题?
答案 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);`