2013-11-06 7 views
0

Я использую 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, в первую очередь.

ответ

0

Ничего не приходит на ум для этой проблемы, возможно, опубликовать код, который поможет ваша попытка. Я контролировал локальные страницы, подобные этой, используя Win32 :: IEAutomation, которая использует Win32 :: OLE без каких-либо проблем, возможно, использует Win32 :: OLE иначе, чем вы.

+0

Вы на 64-битной платформе? – user2961359