Я использую Win32 :: OLE под Perl для управления Internet Explorer. Когда я перехожу к удаленному URL-адресу, все работает так, как вы ожидаете, - я жду, пока $ IE -> {Busy} == 1, тогда я могу запросить {ReadyState} и т. Д.Открытие локального файла в IE под Win32 :: OLE в Perl теряет контакт
Но когда я делаю то же самое вещь с локальным файлом, то сразу после {Busy} больше не верна, я могу получить один {ReadyState} запрос до того, как OLE, похоже, потеряет контакт с экземпляром IE, после чего ничего не работает. В одной конфигурации мне удалось получить Win32 :: OLE-> QueryObjectType, чтобы сказать мне, что «вызванный объект отключился от своих клиентов» - но я не смог повторить это, и кажется, что это очень (результаты Google отображаются по всей карте и по существу выглядят как «что-то пошло не так с указателем где-то»).
Я даже не уверен, как подойти ближе к тому, что происходит под капотом. Есть идеи? Моя неопределенная интуиция заключается в том, что IE создает где-то новый объект, и это не привязывается к объекту OLE Perl или ... что-то. Возможно, я могу использовать события 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 из 3 при первом вызове и 4 на втором, как и ожидалось.
Это сводит меня с ума. Я совершенно потеряю. Я нахожусь в 64-разрядной версии Windows 7 с IE 10.0.9200.16721, хотя я не могу представить, почему это могло бы изменить ситуацию.
Update: Ага, получается, что по состоянию на IE8, IE «иногда» открывает новый процесс при переходе на новую страницу, и что это имеет какое-то отношение их модели доверия.
По существу, чтобы сделать эту простую навигационную работу, мне придется поймать это событие и построить из него новый OLE-объект - в основном IE создает новый IE, который делает навигацию, и старый объект OLE, который Perl отслеживает с помощью Win32 :: OLE закрывается молча. Рамка браузера не изменяется.
Существует ключ реестра, который может заставить всю навигацию IE оставаться в пределах одного кадра, но я действительно не хочу с этим связываться.
О, Microsoft, вы всегда должны устранить все?
MSDN ссылка:
MSDN article touching on this - вот почему я оставил мир программирования Windows, в первую очередь.
Вы на 64-битной платформе? – user2961359