Открытие локального файла в IE под Win32::OLE в Perl теряет контакт

Я использую Win32::OLE под Perl для управления Internet Explorer. Когда я перехожу к удаленному URL-адресу, все работает так, как вы ожидаете - я жду, пока $IE->{Busy} == 1, затем я могу запросить {ReadyState} и т. Д.

Но когда я делаю то же самое с локальным файлом, то сразу после того, как {Busy} больше не имеет значения true, я могу получить один запрос {ReadyState} до того, как OLE потеряет связь с экземпляром IE, после чего ничего не работает. В одной конфигурации мне удалось получить Win32::OLE->QueryObjectType, чтобы сказать мне, что "вызванный объект отключился от своих клиентов" - но я не смог добиться того, чтобы это повторилось, и это, кажется, очень Начать с функции catchall (результаты Google выглядят по всей карте и по сути выглядят как "что-то пошло не так с указателем где-то").

Я даже не уверен, как посмотреть поближе на то, что происходит под капотом. Есть идеи? Моя смутная интуиция заключается в том, что IE создает где-то новый объект, и это не привязывается к OLE-объекту Perl или... чему-то еще. Возможно, я могу использовать OLE-события, чтобы захватить что-то по пути.

редактировать: код, по сути, настолько минималистичен, насколько это возможно:

    $ Win32::OLE:: Warn = 0; 
    my $ IEbrowser = Win32::OLE-> new ('InternetExplorer.Application'); 
    $ IEbrowser-> навигация ("файл:/// C:/projects/wftk/IEMech/Win32-IE-Mechanize/t/formbasics.html");
    #$IEbrowser-> навигация ("http://www.vivtek.com");     
    while (($IEbrowser->{Busy} == 1)){ 
        сна (0.1); 
    }

    print "Вот, пожалуйста!\n"; 
    выведите $IEbrowser->{ReadyState} . "\ П";
    сон (1);
    $IEbrowser->{Visible} = 1;
    выведите $IEbrowser->{ReadyState} . "\ П";

По сути, нет другого способа заставить IE перейти к файлу, кроме этого; быстрое сканирование IEAutomation показывает мне, что оно делает то же самое, что неудивительно.

В любом случае, после извлечения локального файла (который, как вы увидите, является одним из тестовых файлов для Win32::IE::Mechanize), первый вызов {ReadyState} возвращает ноль, затем после сна еще секунду, оба из следующие два вызова не удаются. Если вместо этого я получаю домашнюю страницу своего собственного сайта, она работает нормально, возвращая ReadyState 3 при первом вызове и 4 при втором, как и ожидалось.

Это сводит меня с ума. Я в полной растерянности. Я на 64-битной Windows 7 под управлением IE 10.0.9200.16721, хотя я не могу себе представить, почему это может иметь значение.

Обновление: Ага, получается, что в IE8 IE "иногда" открывает новый процесс при переходе на новую страницу, и это как-то связано с их моделью доверия.

По сути, чтобы эта простая навигация работала, мне нужно будет отловить это событие и построить из него новый объект OLE - в основном IE создает новый IE, который выполняет навигацию, и старый объект OLE, который Perl отслеживает с помощью Win32::OLE закрывается молча. Фрейм браузера не изменяется.

Есть ключ реестра, который может заставить всю навигацию IE оставаться в пределах одного фрейма, но я действительно не хочу возиться с этим.

О, Microsoft, ты всегда должен все усложнять?

MSDN ссылка:
Об этом говорится в статье MSDN - именно поэтому я покинул мир программирования Windows.

1 ответ

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

Другие вопросы по тегам