Есть ли способ заставить IE выгрузить элемент управления ActiveX?
У нас есть динамические HTML-страницы, содержащие тег <OBJECT>
, который создает экземпляр элемента управления ActiveX. Затем пользователь может перейти на другую страницу, содержащую тег <OBJECT>
, который указывает на более новую версию элемента управления ActiveX.
IE загрузит и установит новый ActiveX на второй странице, для чего предназначена эта страница. Проблема в том, что, поскольку IE загрузил ActiveX на первой странице, он теперь заставит пользователя перезагрузиться, прежде чем он полностью установит загруженный ActiveX, поскольку он используется процессом (IE).
В обычном контейнере я просто выгрузил ActiveX перед тем, как попытаться выполнить обновление. Есть ли способ заставить IE сделать это? Прохождение страницы, которая не использует элемент управления, будет приемлемой, если это сделает трюк.
Edit:
Решения, требующие самого действия ActiveX, не будут работать просто потому, что проблема в том, что ActiveX все еще находится в памяти, когда IE начинает установку новой версии ActiveX. То, что я пытаюсь сделать, - НЕ иметь ActiveX в памяти, когда IE запускает этот процесс, поэтому, очевидно, я не могу полагаться на что-либо в самом элементе управления ActiveX.
Ответы
Ответ 1
Попробуйте выполнить оператор удаления javascript:
function unloadObject(objId) {
var obj = document.getElementById(objId);
obj.parentNode.removeChild(obj);
delete obj;
}
Вызовите unloadObject(targetActiveXTagId)
, прежде чем открывать вторую страницу.
В идеале вы должны создать механизм обновления в своем ActiveX. Я видел несколько онлайн-игровых платформ с хорошими результатами.
Ответ 2
Пока я не знаю, как заставить IE выгружать DLL (он держит дескриптор файла DLL открытым - я надеюсь, что он сам выпустит сами объекты)... одно из решений, которое я использую, - это скопировать DLL поверх во временный файл (на основе версии Assembly), прежде чем открывать его, а затем явно нарушать кеширование IE/COM/. Таким образом, я могу получить "новую" версию, загруженную, несмотря на то, что старые файлы файлов DLL остаются открытыми.
Мне удалось сломать кеширование, когда все это выполнено:
- Различные ProgID (динамически сгенерированные, могут отличаться от DLL)
- Различные CLSID (также динамически генерируемые - работают как шарм)
- Различное имя DLL (путем создания копии исходного файла и использования версии сборки это позволяет избежать ошибок доступа к DLL)
- Разная версия сборки (это для .NET)
Я разрабатываю гаджет Sidebar, поэтому я могу сделать это с помощью только некоторых привилегированных компонентов ActiveX script, но компонент ActiveX с предварительным загрузчиком (не обновленный) может также выполнить эту работу.
Я полагаюсь на .NET/mscoree.dll для обработки содержимого COM, поэтому может быть более чистый метод, идущий на более низкий уровень.
Различное "управление версиями" обрабатывается с временными нагрузками в структуре HKCU\Software\Classes.
Ответ 3
Я думаю, что это невозможно.
Ответ 4
Одна вещь, которую вы можете попробовать, - это установить ваш установщик CoFreeUnusedLibraries(), а затем ответить S_OK в DllCanUnloadNow() в вашем элементе управления ActiveX. Это может привести к выгрузке, хотя мне интересно, может ли IE по-прежнему пытаться перезвонить в ваш незагруженный модуль. Прост достаточно, чтобы попробовать.
Вы также можете просто написать DLL-заглушку, которая реализует все интерфейсы, которые у вас есть, которые касаются IE, а затем просто подталкивает вашу реальную DLL, которая фактически реализует функциональность. Затем вы могли бы сообщить своему инсталлятору сообщение, в котором говорится "выгрузить реальную DLL". Затем вы передаете другое сообщение, когда оно будет сделано, и оно загрузит новый. Пока обновление происходит, ваш заглушка рисует сообщение "Подождите, пока я обновляю...".
Ответ 5
Вы пытались использовать Javascript для уничтожения элемента DOM, в котором живет ваш элемент управления ActiveX? Если вы это сделаете, IE сообщит диспетчеру разгрузить, но вы должны убедиться, что элемент управления WILL фактически выгрузится. Затем вы сможете попасть на страницу с помощью новой ссылки на объект, которая запустит новый объект....
В противном случае вы можете попробовать открыть всплывающее окно, которое направляет вас на страницу, которая никогда не загружает ваш объект, и в то же время, используя именованную ссылку на главный браузер, перенаправляет ее на страницу, которая не ссылается на вашу объект, что дает ему возможность выгружать, а затем повторно ссылается на ваш обновленный ActiveX. Это должно загрузить новый элемент управления.
Это липкая проблема, независимо от того, в какую сторону вы идете, но вы можете заставить ее делать то, что вы хотите.
Если ваш элемент управления не работает должным образом, он может не выгружаться должным образом, так что вы должны следить за ним.
Larry
Ответ 6
Вы не можете изменить рабочий процесс? Сначала проверьте обновление и избегайте всей проблемы!
Независимо от того, какое решение вы реализуете, браузер контролируется клиентом, а любые (безопасность) обновления или новые версии могут нарушить работу вашей системы.
Ответ 7
Глупый ответ, извините. Я предполагаю, что перенаправление не сработало, если у вас все еще открыт этот вопрос. Если вы не попробовали, просто создайте страницу, которая перенаправляет на вашу обновленную страницу ActiveX и связывается там.
middleman.html:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>blank page</title>
<meta http-equiv="REFRESH" content="0;url=http://www.newactivexcontrol.com"></HEAD>
<BODY>
</BODY>
</HTML>
Ответ 8
Видимо да и нет.
Это может произойти, но только если вы "взломаете" его с помощью уязвимости безопасности. Так что не через какой-либо законный процесс, нет.
Здесь описывается состояние уязвимости:
http://www.juniper.net/security/auto/vulnerabilities/vuln16409.html
И здесь статья о Technet, обсуждающая, как DWORD ActiveX убивает процесс
http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q240797&sd=tech
Это цитата с веб-сайта MSDN об элементах управления ActiveX:
"Пользователи не могут напрямую взаимодействовать с элементами управления Microsoft ActiveX, которые загружаются элементами APPLET, EMBED или OBJECT. Пользователи могут взаимодействовать с такими элементами управления после активации своих пользовательских интерфейсов".
http://msdn.microsoft.com/en-us/library/ms537508.aspx