загрузить объект ActiveX в апплет - PullRequest
1 голос
/ 15 апреля 2009

У меня есть веб-приложение, которое обрабатывает события и аудио, полученные от специализированного микрофона. Звук обрабатывается Java-апплетом, который запускается на веб-странице, но другие события (микрофон подключен, микрофон отключен, кнопка микрофона нажата) обрабатываются объектом ActiveX.

Объект ActiveX перехватывает эти события и вызывает код JavaScript для их обработки

<!-- Load the ActiveX control -->
<object id="PhilipsSpeechMikeCtrl" width="0" height="0" tabindex="-1"
    classid="CLSID:AAA44754-CC81-4692-91AF-7064E58EB22A"
    standby="Loading Philips SpeechMike component..."
    type="application/x-oleobject">
</object>

<script type="text/javascript">
    // This is Microsofts javascript way of trapping ActiveX object events.

    function PhilipsSpeechMikeCtrl::SPMEventDeviceConnected(deviceID) {
        // Call JavaScript code to handle the microphone connected event
    }

    function PhilipsSpeechMikeCtrl::SPMEventDeviceDisconnected(deviceID) {
        // Call JavaScript code to handle the microphone disconnected event
    }

    function PhilipsSpeechMikeCtrl::SPMEventButton(deviceID, eventId) {
        // Call JavaScript code to handle the microphone button pressed event
    }
</script>

Конечно, проблема этого подхода в том, что он полностью зависит от IE. Я бы предпочел загрузить объект ActiveX в апплет, перехватить там события и обработать события либо в апплете, либо в коде JavaScript, вызванном из апплета. Это должно позволить мне запустить приложение в любом браузере, который поддерживает апплеты.

Я не совсем уверен, как реализовать предложенное выше решение, какие-либо предложения?

Обновление: Я понимаю, что предложенное мной решение все равно будет зависеть от IE, это нормально. Моя ближайшая цель - поддержать все браузеры в Windows.

Было высказано предположение, что вместо использования ActiveX я мог бы использовать JNI (или JNA) для доступа к библиотекам DLL, лежащим в основе объекта ActiveX. Однако на самом деле я не хочу вызывать функции в DLL, я хочу, чтобы библиотеки DLL вызывали меня, то есть регистрировали обработчик событий.

Спасибо, Дон

Ответы [ 8 ]

5 голосов
/ 17 апреля 2009

ActiveX не поддерживаются другим браузером, кроме IE, поэтому приложение не может поддерживать все браузеры, даже только в Windows. Была предпринята попытка (плагин) портировать ActiveX под Firefox 1, но она была не очень полезна, так как, насколько я знаю, сегодня нет решения по "эмуляции" вашего вопроса. Сожалею... (см. здесь для комментариев Mozilla)

3 голосов
/ 22 апреля 2009

JACOB должен позволять вам вызывать COM из Java. Похоже, что он также поддерживает события.

2 голосов
/ 18 апреля 2009

Возможно, вы можете получить доступ к DLL в компоненте ActiveX напрямую, так что вы можете написать упаковщик jni, который вызывает нативные функции, и затем создайте подписанный апплет, который может получить разрешение на использование jni.

Проверьте это:

http://www.raditha.com/java/jni/

1 голос
/ 21 апреля 2009

Вы можете использовать JavaScript, чтобы напрямую вызывать публичные методы в апплете или получать доступ к публичным переменным. JavaScript обрабатывает встроенный апплет как объект. В теге апплета дайте апплету идентификатор имени.

Рассмотрим пример ниже, где апплет имеет метод public void myMethodInMyApplet ();

HTML-страница будет выглядеть примерно так:

<APPLET CODE="MyApplet.class" 
   width=200 height=200 
   name=counter ID=counter>
</APPLET>

<script type="text/javascript">
    // This is Microsofts javascript way of trapping ActiveX object events.

    function PhilipsSpeechMikeCtrl::SPMEventDeviceConnected(deviceID) {
document.applets[0].myMethodInMyApplet();   
 }
 </script>
1 голос
/ 18 апреля 2009

Ааа. Вы можете хотеть этого, но можете отказаться от Javascript и использовать VBScript. Речь идет о возможности отправлять «события» между двумя компонентами.

0 голосов
/ 28 мая 2009

- это активные объекты, всегда посещающие такие сайты, как activex.microsoft.com

0 голосов
/ 24 апреля 2009

Очевидно, что вам придется дважды передавать события, если вы хотите, чтобы они заканчивались в JavaScript.

Существует версия SWT, которая может использоваться в апплетах и ​​может включать элементы управления ActiveX. Есть также коммерческие библиотеки, такие как Coroutine, которые тоже могут это делать (и меньше по размеру банки). Кто-то еще упомянул здесь JACOB, что было бы другим выбором.

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

Чтобы передавать события из Java в JavaScript, вы можете использовать класс netscape.javascript.JSObject, который поддерживается всеми основными браузерами.

Если у вас есть исходный код для компонента COM, было бы неплохо переписать его для использования JNI, так как оболочки COM используют много ресурсов (что особенно важно в апплетах), и, скорее всего, есть также некоторые накладные расходы внутри COM-компонента для COM-взаимодействия.

0 голосов
/ 17 апреля 2009

Разве это не будет зависеть от Windows или даже от IE, учитывая, что Java-апплеты выполняются на стороне клиента? Просто интересно ...

...