none
IE9 MSHTML.IDispatch.GetIDsOfNames____comerror: -2147352570____未知的名称 RRS feed

  • 问题

  • 打开IE9访问页面,通过 SendMessageTimeout “WM_HTML_GETOBJECT” 取到hResult,再得到IHTMLDocument2;IDispatch。

    在IE6、7、8中,IDispatch.GetIDsOfNames和IDispatch.Invoke一切正常。主要用来与JavaScript中的function交互。

    但在IE9 Beta中我发现,可以通过IDispatch.GetIDsOfNames找到JavaScript的window或document的DISPID。
    而查找JavaScript任意function的DISPID时,却报错“未知的名称”。comerror: -2147352570
    查找JavaScript的eval的DISPID时,同样也是报这个错误。

    那么下一步的Invoke将无法继续了。

    希望能解答我的疑问。在IE9正式版时这样的问题是否还存在。有没有其它方案可以代替? 当前我主要用COM技术实施WEB自动化相关工作。

    2011年1月7日 11:38

全部回复

  • 我好想也遇到了同样的问题。动态加添加到body里面的js代码运行不了(或者没运行)。通过GetIDsOfNames得到的也是“未知的名称”。这个是IE9的 BUG么?
    2011年1月10日 2:09
  • 希望是Bug,如果不是Bug,我这边后续工作很难在原框架上展开了。

    2011年1月10日 2:49
  • 虽然我对这个问题不是很熟悉,但是,MSDN上关于IE9的文章对此还是有些介绍的。我不知道你的IDispatch是不是从IHTMLDocument或IHTMLWindow那里QueryInterface来的,如果是这样的话,我建议你尝试从IHTMLDocument或者IHTMLWindow上面query IActiveScript接口。然后使用IActiveScript::GetScriptDispatch方法获得script相关的IDispatch。

    做这样的考虑是因为IE9启用了新的javscript engine,没有办法保证原来的所有行为都有效。

    2011年1月17日 3:45
  • 虽然我对这个问题不是很熟悉,但是,MSDN上关于IE9的文章对此还是有些介绍的。我不知道你的IDispatch是不是从IHTMLDocument或IHTMLWindow那里QueryInterface来的,如果是这样的话,我建议你尝试从IHTMLDocument或者IHTMLWindow上面query IActiveScript接口。然后使用IActiveScript::GetScriptDispatch方法获得script相关的IDispatch。

    做这样的考虑是因为IE9启用了新的javscript engine,没有办法保证原来的所有行为都有效。

    IActiveScript 在IE中是不可用的

    Orz~  沉了~

     

    2011年2月12日 10:11
  • 我今天尝试了一下,从IHTMLDocument2的IDispatch,是不能在IE9中获得javscript函数信息的。这一点并不奇怪,因为浏览器的全局的javascript函数,应该是定义在window对象下的。所以,我尝试了一下通过IHTMLDocument2::get_parentWindow()得到IHTMLWindow2,然后从IHTMLWindow2的IDispatch::GetIDsOfNames,可以得到函数的DISPID。这一点,和在developert toolbar的console中输入名称的结果是一样的:也就是说,在dev toolbar的script console中输入函数名称,如果console显示是javascript函数,则上述方法的GetIDsOfNames()就会成功。
    2011年2月27日 6:22
  • 我今天尝试了一下,从IHTMLDocument2的IDispatch,是不能在IE9中获得javscript函数信息的。这一点并不奇怪,因为浏览器的全局的javascript函数,应该是定义在window对象下的。所以,我尝试了一下通过IHTMLDocument2::get_parentWindow()得到IHTMLWindow2,然后从IHTMLWindow2的IDispatch::GetIDsOfNames,可以得到函数的DISPID。这一点,和在developert toolbar的console中输入名称的结果是一样的:也就是说,在dev toolbar的script console中输入函数名称,如果console显示是javascript函数,则上述方法的GetIDsOfNames()就会成功。


    遗憾,我按照你的方法没有成功。这与IE9的版本会不会有关系?

    不论我通过IHTMLDocument2还是IHTMLWindow2获取到的IDispatch,都不能通过GetIDsOfNames得到某函数的DISPID,但是GetIDsOfNames('alert')这样就都可以找DISPID。我猜想JavaScript虚拟机内的命名空间应该不受COM接口影响。

    我也确定我的函数没有问题,因为我也用Developert toolbar的console测试过函数是否正常。

    2011年3月1日 6:41
  • 这个很奇怪。我使用的是http://bing.com,并选取了其中某个脚本都有的函数名进行过测试并且成功了。

    如果你可以提供一个公开的网站和一个其中的特定的函数,会有助于解决该问题。我现在怀疑,会不会是脚本还没有被javascript engine加载。

    我所使用的是IE9 RC。

    2011年3月1日 8:00
  • 这个很奇怪。我使用的是http://bing.com,并选取了其中某个脚本都有的函数名进行过测试并且成功了。

    如果你可以提供一个公开的网站和一个其中的特定的函数,会有助于解决该问题。我现在怀疑,会不会是脚本还没有被javascript engine加载。

    我所使用的是IE9 RC。

    我特意去尝试了一下 http://bing.com 依然是同样的情况,我已经通过微软的 IE Dev toolbar 验证了JavaScript加载正常,并且可以调用函数。 我怀疑你是否没有将 IE9 RC 切换到IE9文档模型,如果不是IE9文档模型,那样确实没问题。只有IE9RC在IE9文档模型下才能重现我的问题。
    2011年3月5日 11:48
  • 嗯,我确实没有试IE9模式。回头试试看。
    2011年3月5日 22:57