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

时间:2013-11-06 16:40:23

标签: perl internet-explorer win32ole

我在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编程世界的原因。

1 个答案:

答案 0 :(得分:0)

对于这个问题没有任何想法,也许发布您尝试的代码会有所帮助。我使用Win32 :: IEAutomation控制本地页面使用Win32 :: OLE没有任何问题,也许它以不同于你的方式使用Win32 :: OLE。