Существует ли способ вынудить IE разгрузить элемент управления ActiveX?

Как насчет:

input.type = "text";
input.type = "file";

Мне все еще нужно понять, почему это не работает с webkit.

В любом случае, это работает с IE9>, Firefox и Opera. Ситуация с webkit заключается в том, что я, похоже, не могу изменить ее обратно в файл. В IE8 ситуация заключается в том, что она выдает исключение безопасности.

Изменить: для webkit, Opera и firefox это работает, хотя:

input.value = '';

(проверьте выше ответ с этим предложением)

Я посмотрю если я могу найти более чистый способ сделать этот кросс-браузер без необходимости использования GC.

Edit2:

try{
    inputs[i].value = '';
    if(inputs[i].value){
        inputs[i].type = "text";
        inputs[i].type = "file";
    }
}catch(e){}

Работает с большинством браузеров. Не работает с IE & lt; 9, вот и все. Протестировано на firefox 20, chrome 24, opera 12, IE7, IE8, IE9 и IE10.

15
задан Ori Pessach 19 March 2009 в 16:27
поделиться

8 ответов

Попробуйте оператор удаления JavaScript:

function unloadObject(objId) {

    var obj = document.getElementById(objId);

    obj.parentNode.removeChild(obj);

    delete obj;
}

Вызов unloadObject(targetActiveXTagId) прежде, чем открыть Вашу вторую страницу.

Идеально, необходимо встроить механизм обновления в ActiveX сам. Я видел, что несколько платформ онлайн-игры делают это с хорошими результатами.

7
ответ дан 1 December 2019 в 05:07
поделиться

Я думаю, что это не возможно.

1
ответ дан 1 December 2019 в 05:07
поделиться

Одна вещь, которую можно попробовать, имеет вызов установщика CoFreeUnusedLibraries () , и затем ответьте S_OK в DllCanUnloadNow () в элементе управления ActiveX. Это могло бы разгрузить Вас, хотя интересно, может ли IE все еще попытаться перезвонить в Ваш разгруженный модуль. Достаточно простой попробовать.

Вы могли также просто записать тупиковый DLL, который реализует все Интерфейсы, у Вас есть тот сенсорный IE, и затем просто преобразовывает до Вашего реальный DLL, который на самом деле реализует функциональность. Тогда у Вас мог быть свой установщик, широковещательно передает сообщение, в котором говорится, "разгружают реальный DLL". Тогда Вы широковещательно передаете другое сообщение, когда Ваш сделанный и оно загружают новое. В то время как обновление происходит, Ваш тупик тянет, "Ожидайте, в то время как я обновляю..." сообщение.

0
ответ дан 1 December 2019 в 05:07
поделиться

Вы попытались использовать JavaScript для уничтожения элемента DOM, в котором живет элемент управления ActiveX? Если Вы сделаете это, то IE скажет управлению разгружаться, но необходимо удостовериться, что управление на самом деле разгрузится. Затем необходимо быть в состоянии поразить страницу более новой ссылкой на объект, которая запустит более новый объект....

Сбой, что, можно попытаться открыть всплывающее окно, которое направляет Вас к странице, которая никогда не загружает Ваш объект, и в то же время, с помощью именованной ссылки на основной браузер, перенаправьте его к странице, которая не ссылается объект, давая ему шанс разгрузиться, затем повторно ссылаясь обновленный ActiveX. Это должно загрузить Ваше более новое управление.

Это - липкая проблема, неважно, какой путь Вы идете, но можно быть в состоянии заставить это делать то, что Вы хотите.

, Если Ваше управление не ведет себя правильно, оно не может разгрузиться правильно, таким образом, это - что-то, которое необходимо не упустить.

Larry

0
ответ дан 1 December 2019 в 05:07
поделиться

Глупый ответ, извините. Я предполагаю, что перенаправление не работало, если у Вас все еще есть этот открытый вопрос. Если Вы не попробовали tho, просто создаете страницу, которая перенаправляет к Вашей обновленной странице 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>
-1
ответ дан 1 December 2019 в 05:07
поделиться

Разве Вы не можете изменить рабочий процесс? Проверьте на обновление сначала и избегайте целой проблемы!

Безотносительно решения, которое Вы реализуете, браузером управляют клиент и любой (безопасность), обновления или новые версии могут повредить Вашу систему.

0
ответ дан 1 December 2019 в 05:07
поделиться

По-видимому, да и нет.

Это может произойти, но только если Вы "Взлом" это через уязвимость системы обеспечения безопасности. Так не посредством любого законного процесса, нет.

Вот статья, описывающая состояние уязвимости: http://www.juniper.net/security/auto/vulnerabilities/vuln16409.html

И вот является статьей об обсуждении Technet, как ActiveX DWORD уничтожает процесс http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q240797&sd=tech

, Это - кавычка от веб-сайта MSDN об элементах управления ActiveX:

"Пользователи не могут непосредственно взаимодействовать со средствами управления Microsoft ActiveX, загруженными АППЛЕТОМ, ВСТРОИТЬ или ВОЗРАЗИТЬ элементам. Пользователи могут взаимодействовать с такими средствами управления после активации их пользовательских интерфейсов". http://msdn.microsoft.com/en-us/library/ms537508.aspx

-1
ответ дан 1 December 2019 в 05:07
поделиться

Хотя я не знаю способа заставить IE выгрузить DLL (он держит хэндл DLL-файла открытым -- я надеюсь, что он освобождает сами объекты корректно. ...) Одним из решений, которое я использую, является копирование DLL во временный файл (основанный на версии Assembly) перед его открытием, а затем явное нарушение IE/COM/какого бы то ни было кэширования. Таким образом, я могу загрузить "новую" версию, даже если старые дескрипторы DLL остаются открытыми.

Я смог нарушить кэширование только тогда, когда все из них встретились:

  1. Different ProgID (динамически сгенерированный, может отличаться от DLL)
  2. Different CLSID (также динамически сгенерированный -- работает как шарм)
  3. Different DLL name (путем копирования оригинала)
  4. Different DLL name (путем копирования оригинала. файл и использование ассемблерной версии позволяет избежать ошибок доступа к DLL)
  5. Различная ассемблерная версия (это для .NET)

Я разрабатываю для Sidebar Gadget, так что я могу сделать это только с некоторыми привилегированными ActiveX компонентами, удобными для работы со сценариями, но компонент ActiveX с предустановленным (не обновленным) интерфейсом также может быть способен сделать эту работу.

Я полагаюсь на .NET/mscoree.dll для работы с COM-файлами, так что может быть более чистый метод, переходящий на более низкий уровень.

Различная "версионность" обрабатывается с временной нагрузкой в структуре HKCU\Software\Classes.

.
2
ответ дан 1 December 2019 в 05:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: