我在Perl下使用Win32 :: OLE来引导Internet Explorer。当我导航到远程URL时,一切都按预期工作 - 我等待$ IE-> {Busy} == 1,然后我可以查询{ReadyState}等等。
但是当我对本地文件执行完全相同的操作时,就在{Busy}不再正确之后,我可以在OLE看起来与IE实例失去联系之前获得一个{ReadyState}查询,之后什么都没有作品。在一个配置中,我设法获取Win32 :: OLE-> QueryObjectType告诉我“调用的对象已与其客户端断开连接” - 但我无法再次发生这种情况,而且它似乎是一个非常繁琐的功能开始(谷歌的结果似乎遍布地图,基本上看起来像“指针某处出了问题”)。
我甚至不确定如何更仔细地了解幕后发生的事情。有任何想法吗?我模糊的直觉是IE正在某处创建一个新对象,这并没有附加到Perl的OLE对象或......某些东西。可能是我可以使用OLE事件来捕获一些东西。
编辑:的 代码基本上与人类一样简约:
$Win32::OLE::Warn = 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->{Busy} == 1)){ sleep(0.1); } print "There you go!\n"; print $IEbrowser->{ReadyState} . "\n"; sleep(1); $IEbrowser->{Visible} = 1; print $IEbrowser->{ReadyState} . "\n";
基本上没有其他方式让IE转到文件而不是这个; IEAutomation的快速扫描显示它完全相同,这并不令人惊讶。
无论如何,在检索本地文件(正如您将看到的,是Win32 :: IE :: Mechanize的测试文件之一)之后,对{ReadyState}的第一次调用返回零,然后再睡一秒,接下来的两个电话都失败了。如果我改为检索我自己网站的主页,它可以正常工作,在第一次调用时返回ReadyState,在第二次调用时返回4,正如预期的那样。
这让我发疯了。我完全失去了。我在运行IE 10.0.9200.16721的64位Windows 7上,虽然我无法想象为什么这可能会有所作为。
更新的 Aha,事实证明,从IE8开始,IE“有时”在导航到新页面时会打开一个新进程,这与他们的信任模型有关。
基本上,为了使这个简单的导航工作,我将不得不捕获该事件并从中构建一个新的OLE对象 - 基本上IE正在创建导航的新IE,以及Perl使用Win32跟踪的旧OLE对象:: OLE静默关闭。浏览器框架不受影响。
有一个注册表项可以强制所有IE导航保持在一个帧内,但我真的不想搞砸它。
哦,微软,你是否总是过分复制一切?
MSDN链接:
MSDN article touching on this - 这就是我首先离开Windows编程世界的原因。
答案 0 :(得分:0)
对于这个问题没有任何想法,也许发布您尝试的代码会有所帮助。我使用Win32 :: IEAutomation控制本地页面使用Win32 :: OLE没有任何问题,也许它以不同于你的方式使用Win32 :: OLE。