2009-04-15 75 views
1

我有一个Web应用程序,用于处理从专用麦克风接收到的事件和音频。音频由网页中运行的Java小应用程序处理,但其他事件(麦克风连接,麦克风断开连接,按下麦克风按钮)由ActiveX对象处理。在Applet中加载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上的所有浏览器。

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

谢谢, 唐

回答

5

另一个浏览器不支持ActiveX,因此您的应用程序无法支持所有浏览器,即使在Windows上也是如此。 尝试(插件)在Firefox 1下移植ActiveX,但据我所知,并没有真正有用,现在还没有针对您的问题的“模拟”解决方案。 对不起...... (见here为Mozilla评论)

+0

其他浏览器不支持ActiveX,但Java是。您可以从Java调用ActiveX。 – 2009-05-01 19:55:27

+0

如何从Java调用ActiveX控件(带有图形组件)? – GreatDane 2014-10-08 11:02:34

0

那不是仍然是因为Java小程序在客户端上执行Windows或甚至IE相关的,?只是想知道...

+0

我已经更新了原来的职位 – 2009-04-17 17:42:30

+0

OK的acivex网站。对不起,我不知道该如何帮助你。 :-) – 2009-04-18 13:28:54

2

你或许可以直接访问这些DLL的ActiveX组件, 所以你可以写一个JNI包装,调用本机的功能, 再建一个签名Applet可以获得使用jni的权限。

检查:

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

1

啊。你可以确实想要你的愿望,但可能不得不放弃Javascript而改用VBScript。这是关于在两个组件之间发送“事件”的能力。

1

您可以使用JavaScript直接调用applet中的公共方法或访问公共变量。 JavaScript将嵌入式小程序视为一个对象。在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> 
3

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

0

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

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

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

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

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

0

是activexobjects总是像打activex.microsoft.com