【问题标题】:"specified cast not valid" when using execScript使用 execScript 时“指定的强制转换无效”
【发布时间】:2011-12-14 19:22:56
【问题描述】:

我正在尝试在 IE 内的 iframe 上执行脚本,但我总是得到“指定的强制转换无效”:

IWebBrowser2 iWebBrowser2 = GetIframe(); //retrieve the iframe (saved in document complete event) 
IHTMLDocument2 document = iWebBrowser2.Document as IHTMLDocument2; 
document.parentWindow.execScript("alert('test');", "javascript"); 

当我尝试访问 document.parentWindow 时出现问题(即使询问 document.parentWindow 是否!= null)。

重要的是,我是从与文档完成事件线程不同的线程执行此操作的。

你能帮我解决这个问题吗?

谢谢,

暗里

【问题讨论】:

    标签: internet-explorer casting ihtmldocument2


    【解决方案1】:

    您是否考虑过 iframe 异步加载到主文档的事实?这意味着即使 documentCompleted 可能已针对主文档触发,iframe 很可能在接下来的几秒钟内仍不会加载。判断 iframe 是否已加载有点棘手,但您可以通过在实际调用之前引入人为延迟(a-la Timer)来测试您的方法,以允许 iframe 首先加载。希望这会有所帮助。

    【讨论】:

    • 虽然我添加了延迟,但它仍然会抛出同样的异常。
    【解决方案2】:

    我怀疑是线程相关的问题。您不能只从不同的线程访问 MSHTML 接口,至少不能不进行一些编组。尝试在“文档完成事件线程”(又名主线程)上调用您的代码。

    【讨论】:

      【解决方案3】:

      虽然我在不完全熟悉这个特定用例之前曾使用过 IE。一些快速的谷歌搜索发现了一个有趣的注释:

      http://msdn.microsoft.com/en-us/library/aa752116(v=vs.85).aspx

      警告如果文档对象类型对脚本不安全,此方法会成功返回,但会将 ppDisp 设置为 NULL。

      如果您不安全地编写脚本并且 iWebBrowser2.Document 为空,这可能是导致您的问题的原因吗?

      【讨论】:

      • 不,我认为这与我从不同的线程做这件事有关。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-23
      • 2018-05-27
      • 2014-07-30
      • 2012-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多