Различия в методах загрузки ActiveX - PullRequest
0 голосов
/ 05 августа 2011

У меня есть пользовательский элемент управления ActiveX, который используется веб-страницами в IE. Он загружается очень хорошо и доступен для Javascript, запущенного на странице, если я загружаю его через тег OBJECT, например:

<object id="ccl" codeBase="ccl.cab" classid="CLSID:12372D58-F10C-11CF-B7A9-0020AFD6A362" NOEXTERNALDATA="true"></object>

Но если я попытаюсь загрузить его через новый ActiveXObject () следующим образом:

var x = new ActiveXObject('myObj.abc');

Я получаю сообщение об ошибке «Сервер автоматизации не может создать объект».

Я думал, что эти два метода загрузки документа были эквивалентны в случае, когда элемент управления ActiveX уже установлен. Но, видимо, это не так. Может кто-нибудь помочь мне понять, при каких условиях метод тега OBJECT будет успешным, в то время как новый метод ActiveXObject потерпит неудачу? Я дважды проверил, чтобы убедиться, что progID, который я передаю в новый ActiveXObject (), правильный и отображается в реестре в HKEY_CLASSES_ROOT \ CLSID, как и должно быть. Заранее спасибо за любые идеи.

Ответы [ 3 ]

0 голосов
/ 05 августа 2011

Запуск для объектов, созданных в теге объекта, или объекта, созданного с помощью ActiveXObject, различен - они должны быть, когда вы об этом думаете, поскольку у человека нет окна для рисования. Как и намекнул здесь тег объекта создает экземпляр элемента управления как IObjectWithSite (от mshtml.dll), тогда как новый ActiveXObject создает его как IOleObject (от jscript.dll).

Это означает, что с ActiveXObject, SetSite называется и с тегом объекта SetClientSite называется .Кроме того, вы не получите ни вызовов IPersistPropertyBag, ни вызовов InPlaceActivate и т. Д. С ActiveXObject.

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

Более полное объяснение (от того, кто понимает его лучше) можно найти здесь .

0 голосов
/ 09 августа 2011

Спасибо тем, кто отправил предыдущие ответы. Хотя они не дали решения моей проблемы, они поставили меня на правильный путь, чтобы сам найти ответ.

Проблема заключалась в том, что мой элемент управления ActiveX использовал реализацию IObjectSafety, предоставляемую шаблоном Microsoft SiteLock (IObjectSafetySiteLockImpl). Как говорится в документации SiteLock:

Если вы создаете элемент управления ActiveX через скрипт (вместо использования тега), то Хостинг скриптов отвечает за настройку сайта, а не браузер. Ни JavaScript, ни> движок VBScript не установят сайт до тех пор, пока он не решит, что вы в безопасности, поэтому вы не можете таким образом создайте заблокированный на сайте элемент управления.

В этом случае моему элементу ActiveX не требовалась функциональность SiteLock, поэтому я заменил IObjectSafetySiteLockImpl стандартной реализацией ATL IObjectSafey (IObjectSafetyImpl).

0 голосов
/ 05 августа 2011

Я не могу найти поддерживающую ссылку, но IE (по крайней мере, более старые версии, такие как 6 и 7) не позволит вам запускать события из элементов управления, созданных с помощью нового ActiveXObject (). Могут быть и другие отличия ... внутри IE пути кода очень разные. Я не знаю полного руководства.

Вы можете установить точки останова в вашем методе SetSite () и посмотреть, вызывается ли он. Также проверьте правильность вашей регистрации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...