在Applet中加载ActiveX对象

时间:2009-04-15 15:52:31

标签: java activex applet cross-browser

我有一个Web应用程序,用于处理从专用麦克风接收的事件和音频。音频由在网页中运行的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。我更喜欢在applet中加载ActiveX对象,在那里捕获事件并处理applet中的事件或从applet调用的JavaScript代码。这应该使我能够在任何支持applet的浏览器中运行应用程序。

我不完全确定如何实施上面提出的解决方案,任何建议?

更新:我意识到我上面提出的解决方案仍然依赖于IE,这很好。我的直接目标是支持Windows上的所有浏览器。

有人建议我可以使用JNI(或JNA)来访问ActiveX对象底层的DLL,而不是使用ActiveX。但是,我实际上并不想调用DLL中的函数,我希望DLL调用我,即注册一个事件处理程序。

谢谢, 唐

8 个答案:

答案 0 :(得分:5)

除了IE之外,其他浏览器不支持ActiveX,因此您的应用程序无法支持所有浏览器,即使仅在Windows上也是如此。 在Firefox 1下移植ActiveX的尝试(插件)已经完成,但实际上没有用,所以据我所知,今天没有“仿真”解决方案。 抱歉... (有关Mozilla评论,请参阅here

答案 1 :(得分:3)

JACOB应该让你从Java调用COM。看起来它也支持事件。

答案 2 :(得分:2)

您可以直接访问activeX组件中的dll, 所以你可以编写一个调用本机函数的jni包装器, 然后构建一个签名的applet,可以获得使用jni的权限。

检查一下:

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

答案 3 :(得分:1)

稀释。你可以想要你想要的,但可能不得不避免使用JBS而是利用VBScript。它是关于在两个组件之间发送“事件”的能力。

答案 4 :(得分:1)

您可以使用JavaScript直接调用applet中的公共方法或访问公共变量。 JavaScript将嵌入式applet视为对象。在applet标记中,为applet指定一个名称id。

考虑以下示例,其中applet具有方法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>

答案 5 :(得分:0)

考虑到Java applet是在客户端执行的,那还不是Windows或IE依赖吗?只是想知道...

答案 6 :(得分:0)

如果您希望它们以JavaScript结尾,您显然必须将事件传递两次。

有一个版本的SWT可以在applet中使用,并且可以嵌入ActiveX控件。还有像Coroutine这样的商业图书馆也可以这样做(并且罐子尺寸较小)。其他人在这里提到了JACOB,这将是另一种选择。

因此,使用这些组件中的任何一个来包装ActiveX控件。这些库将在发生注册事件时调用Java方法。

要将事件从Java传递到JavaScript,您可以使用所有主流浏览器都支持的netscape.javascript.JSObject类。

如果你有COM组件的源代码,那么重写它以使用JNI可能是一个好主意,因为COM包装器占用了大量资源(这在applet中尤为重要),而且很可能是COM组件内部的一些开销也用于COM互操作。

答案 7 :(得分:0)

是activexobjects总是点击像activex.microsoft.com这样的acivex网站