【问题标题】:load ActiveX object in Applet在 Applet 中加载 ActiveX 对象
【发布时间】:2009-04-15 15:52:30
【问题描述】:

我有一个 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。我更愿意在小程序中加载 ActiveX 对象,在那里捕获事件并在小程序或从小程序调用的 JavaScript 代码中处理事件。这应该使我能够在任何支持小程序的浏览器中运行该应用程序。

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

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

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

谢谢, 唐

【问题讨论】:

    标签: java activex applet cross-browser


    【解决方案1】:

    除 IE 之外的其他浏览器不支持 ActiveX,因此您的应用程序无法支持所有浏览器,即使仅在 Windows 上也是如此。 尝试(插件)在 Firefox 1 下移植 ActiveX,但据我所知并没有真正有用,今天没有“仿真”解决方案可以解决您的问题。 对不起... (有关 Mozilla cmets,请参阅 here

    【讨论】:

    • 其他浏览器不支持 ActiveX,但 Java 支持。您可以从 Java 调用 ActiveX。
    • 如何从 Java 中调用ActiveX control(带有图形组件)?
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      检查这个:

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

      【讨论】:

        【解决方案4】:

        啊。您可以随心所欲,但可能不得不避开 Javascript 而是利用 VBScript。它是关于在两个组件之间发送“事件”的能力。

        【讨论】:

        • VBScript不是只支持IE吗?
        【解决方案5】:

        您可以使用 JavaScript 直接调用小程序中的公共方法或访问公共变量。 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>
        

        【讨论】:

        • 我需要捕获的事件是由嵌入在页面中的 ActiveX 控件引发的,而不是 Applet
        • 您能否在这些事件中调用您定义的调用小程序公共方法的 javascript 方法?
        【解决方案6】:

        考虑到 Java 小程序是在客户端执行的,那不还是依赖于 Windows 甚至 IE 吗?只是想知道...

        【讨论】:

        • 好的。对不起,我不知道如何帮助你。 :-)
        【解决方案7】:

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

        有一个版本的 SWT 可以在 applet 中使用,并且可以嵌入 ActiveX 控件。还有像 Coroutine 这样的商业库也可以做到这一点(并且 jar 体积更小)。这里有人提到了JACOB,这将是另一种选择。

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

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

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

        【讨论】:

          【解决方案8】:

          activexobjects 是否总是访问像 activex.microsoft.com 这样的 acivex 网站

          【讨论】:

            猜你喜欢
            • 2010-09-17
            • 1970-01-01
            • 2014-03-06
            • 2015-01-08
            • 1970-01-01
            • 2020-07-07
            • 2012-11-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多