我在 Perl 下使用 Win32::OLE 来引导 Internet Explorer。当我导航到远程 URL 时,一切都如您所愿 - 我等待 $IE->{Busy} == 1,然后我可以查询 {ReadyState} 等。
但是,当我对本地文件执行完全相同的操作时,在 {Busy} 不再为真之后,我可以在 OLE 似乎与 IE 实例失去联系之前获得一个 {ReadyState} 查询,之后没有任何效果。在一个配置中,我设法让 Win32::OLE->QueryObjectType 告诉我“调用的对象已与其客户端断开连接” - 但我无法再次发生这种情况,这似乎是一个非常开始的全部功能(Google 结果似乎遍布地图,基本上看起来像“某处的指针出了问题”)。
我什至不确定如何仔细观察引擎盖下发生的事情。有任何想法吗?我模糊的直觉是 IE 在某处创建了一个新对象,而这并没有附加到 Perl 的 OLE 对象或……什么东西上。可能是我可以使用 OLE 事件来捕获沿途的东西。
编辑: 代码本质上是尽可能人性化的:
$Win32::OLE::Warn = 0; 我的 $IEbrowser = Win32::OLE->new('InternetExplorer.Application'); $IEbrowser->navigate("file:///c:/projects/wftk/IEMech/Win32-IE-Mechanize/t/formbasics.html"); #$IEbrowser->navigate("http://www.vivtek.com"); 而 (($IEbrowser->{忙碌} == 1)){ 睡眠(0.1); } 打印“你去!\n”; 打印 $IEbrowser->{ReadyState} 。"\n"; 睡眠(1); $IEbrowser->{可见} = 1; 打印 $IEbrowser->{ReadyState} 。"\n";
基本上没有其他方法可以让 IE 访问文件。快速浏览一下 IEAutomation,我发现它做的事情完全一样,这并不奇怪。
无论如何,在检索到本地文件(如您将看到的那样,它是 Win32::IE::Mechanize 的测试文件之一)之后,对 {ReadyState} 的第一次调用返回零,然后再休眠一秒钟后,两者接下来的两个电话失败。如果我改为检索自己网站的主页,它可以正常工作,在第一次调用时返回 ReadyState 3,在第二次调用时返回 4,正如预期的那样。
这真让我抓狂。我完全不知所措。我在运行 IE 10.0.9200.16721 的 64 位 Windows 7 上,虽然我无法想象为什么这可能会有所作为。
更新: 啊哈,事实证明,从 IE8 开始,IE“有时”在导航到新页面时会打开一个新进程,这与他们的信任模型有关。
本质上,为了使这个简单的导航工作,我将不得不捕获该事件并从中构建一个新的 OLE 对象 - 基本上 IE 正在创建执行导航的新 IE,以及 Perl 正在使用 Win32::OLE 跟踪的旧 OLE 对象无声关闭。浏览器框架不受影响。
有一个注册表项可以强制所有 IE 导航保持在一个框架内,但我真的不想搞砸。
哦,微软,你必须总是把一切都复杂化吗?
MSDN 链接:
MSDN 文章涉及到这一点——这就是我最初离开 Windows 编程世界的原因。