在 Perl 中的 Win32::OLE 下打开 IE 中的本地文件会失去联系



我在Perl下使用Win32::OLE来引导Internet Explorer。当我导航到远程 URL 时,一切都像您期望的那样工作 - 我等待 $IE->{忙碌} == 1,然后我可以查询 {ReadyState} 等。

但是当我对本地文件做完全相同的事情时,在 {Busy} 不再为真之后,我可以在 OLE 似乎与 IE 实例失去联系之前获取一个 {ReadyState} 查询,之后没有任何效果。在一个配置中,我设法让 Win32::OLE->QueryObjectType 告诉我"调用的对象已与其客户端断开连接" - 但我无法让这种情况再次发生,它似乎是一个非常包罗万象的功能开始(谷歌结果似乎遍布地图,基本上看起来像"某处指针出了问题")。

我什至不确定如何仔细观察引擎盖下发生的事情。有什么想法吗?我模糊的直觉是IE正在某处创建一个新对象,而这并没有附加到Perl的OLE对象或...东西。可能是我可以使用 OLE 事件来捕获沿途的某些内容。

编辑:代码本质上是尽可能简约的:

   $Win 32::OLE::警告 = 0;    my $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");        while (($IEbrowser->{忙碌} == 1)){        睡眠(0.1);    }    打印"你去吧!";    打印$IEbrowser->{就绪状态} ."";    睡眠(1);    $IEbrowser->{可见} = 1;    打印$IEbrowser->{就绪状态} ."";

基本上没有其他方法可以让IE进入文件;快速扫描IEAutomation向我显示它做完全相同的事情,这并不奇怪。

无论如何,在检索本地文件(如您所见,这是 Win32::IE::Mechanize 的测试文件之一)后,对 {ReadyState} 的第一次调用返回零,然后在休眠一秒钟后,接下来的两个调用都失败。如果我改为检索我自己网站的主页,它工作正常,在第一次调用时返回 ReadyState 3,在第二次调用时返回 4,正如预期的那样。

这让我发疯。我完全不知所措。我使用的是运行IE 64.0.9200.16721的64位Windows 7,尽管我无法想象为什么这可能会有所作为。

更新:啊哈,事实证明,从IE8开始,IE"有时"在导航到新页面时会打开一个新过程,这与他们的信任模型有关。

从本质上讲,为了使这个简单的导航工作,我必须捕获该事件并从中构建一个新的 OLE 对象 - 基本上 IE 正在创建执行导航的新 IE,而 Perl 使用 Win32::OLE 跟踪的旧 OLE 对象以静默方式关闭。 浏览器框架不受影响。

有一个注册表项可以强制所有IE导航保持在单个框架内,但我真的不想弄乱它。

哦,Microsoft,你必须总是把一切都复杂化吗?

MSDN 链接:
MSDN的文章谈到了这一点 - 这就是我首先离开Windows编程世界的原因。

对于

这个问题,什么都没有想到,也许发布您尝试的代码会有所帮助。我已经使用 Win32::IEAutomation 控制了这样的本地页面,它使用 Win32::OLE 没有任何问题,也许它以与您不同的方式使用 Win32::OLE。

最新更新