2009-04-15 6 views
1

Ich habe eine Webanwendung, die Ereignisse und Audio von einem speziellen Mikrofon verarbeitet verarbeitet. Die Audiodaten werden von einem Java-Applet verarbeitet, das auf der Webseite ausgeführt wird. Andere Ereignisse (Mikrofonverbindung, Mikrofonverbindung getrennt, Mikrofonschaltfläche gedrückt) werden jedoch von einem ActiveX-Objekt verarbeitet.laden ActiveX-Objekt in Applet

Das ActiveX-Objekt einfängt diese Ereignisse und ruft JavaScript-Code ihnen

<!-- 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> 

Natürlich zu behandeln ein Problem bei diesem Ansatz ist, dass es völlig IE abhängig. Ich würde es vorziehen, das ActiveX-Objekt innerhalb des Applet zu laden, die Ereignisse dort einzufangen und die Ereignisse entweder innerhalb des Applet oder JavaScript-Code aus dem Applet zu behandeln. Dies sollte mir dann ermöglichen, die App in jedem Browser auszuführen, der Applets unterstützt.

Ich bin mir nicht ganz sicher, wie man die oben vorgeschlagene Lösung implementiert, irgendwelche Vorschläge?

Update: Ich realisiere, dass die Lösung, die ich oben vorgeschlagen habe, noch IE abhängig sein würde, das ist in Ordnung. Mein unmittelbares Ziel ist es, alle Browser unter Windows zu unterstützen.

Es wurde vorgeschlagen, anstelle von ActiveX könnte ich JNI (oder JNA) verwenden, um auf die DLLs zuzugreifen, die dem ActiveX-Objekt zugrunde liegen. Allerdings möchte ich die Funktionen in den DLLs nicht wirklich aufrufen, ich möchte, dass die DLLs mich aufrufen, d. H. Einen Ereignishandler registrieren.

Danke, Don

Antwort

5

ActiveX werden nicht von einem anderen Browser als IE unterstützt, so dass Ihre Anwendung nicht alle Browser unterstützen kann, auch nur unter Windows. Ein Versuch (Plugin), ActiveX unter Firefox 1 zu portieren, wurde gemacht, war aber nicht wirklich nützlich, so weit ich weiß, gibt es heute keine "Emulations" -Lösung für Ihre Frage. Sorry ... (siehe here für Mozilla Kommentare)

+0

ActiveX wird in anderen Browsern nicht unterstützt, aber Java ist. Sie können ActiveX von Java aus aufrufen. –

+0

Wie nennt man ein 'ActiveX-Steuerelement' (mit grafischen Komponenten) von Java? – GreatDane

0

Würde noch nicht, dass Windows- oder sogar IE abhängig, gegeben sein, dass Java-Applets auf der Client-Seite ausgeführt werden? Nur wundern ...

+0

ich die Original-Beitrag –

+0

OK aktualisiert haben. Entschuldigung, ich weiß nicht, wie ich dir dann helfen soll. :-) –

2

Sie wahrscheinlich die DLLs in der ActiveX-Komponente direkt zugreifen können, so können Sie einen jni Wrapper schreiben, die die nativen Funktionen aufrufen, und dann ein signiertes Applet bauen das kann die Erlaubnis bekommen, jni zu benutzen.

prüfen dies:

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

1

Ahh. Sie können wollen, dass Sie es wünschen, aber möglicherweise Javascript vermeiden und stattdessen VBScript nutzen. Es geht um die Möglichkeit, "Ereignisse" zwischen zwei Komponenten zu senden.

+0

Wird VBScript nicht nur in IE unterstützt? –

1

Sie können JavaScript verwenden, um öffentliche Methoden im Applet direkt aufzurufen oder auf öffentliche Variablen zuzugreifen. JavaScript behandelt das eingebettete Applet als ein Objekt. Geben Sie dem Applet im Applet-Tag eine Name-ID.

Betrachten Sie das folgende Beispiel, in dem das Applet eine Methode public void hat myMethodInMyApplet();

<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> 
+0

Die Ereignisse, die ich abfangen muss, werden vom ActiveX-Steuerelement ausgelöst, das auf der Seite eingebettet ist, nicht das Applet –

+0

Könnten Sie dann in diesen Ereignissen die JavaScript-Methoden aufrufen, die die Applets öffentliche Methoden aufrufen? –

3

JACOB soll Sie COM von Java rufen lassen:

Die HTML-Seite etwas aussehen würde. Es sieht so aus, als ob es auch Ereignisse unterstützt.

0

Sie müssen die Ereignisse natürlich zweimal übergeben, wenn Sie möchten, dass sie in JavaScript enden.

Es gibt eine Version von SWT, die in Applets verwendet werden kann und ActiveX-Steuerelemente einbetten kann. Es gibt auch kommerzielle Bibliotheken wie Coroutine, die das auch tun können (und in der Glasgröße kleiner sind). Jemand anderes hat JACOB hier erwähnt, was eine andere Wahl wäre.

Verwenden Sie also eine dieser Komponenten, um Ihr ActiveX-Steuerelement einzubinden. Diese Bibliotheken rufen eine Java-Methode auf, wenn ein registriertes Ereignis auftritt.

Um Ereignisse von Java an JavaScript zu übergeben, können Sie die Klasse netscape.javascript.JSObject verwenden, die von allen gängigen Browsern unterstützt wird.

Wenn Sie den Quellcode für die COM-Komponente haben, könnte es eine gute Idee sein, sie für JNI neu zu schreiben, da COM-Wrapper eine Menge Ressourcen verbrauchen (was besonders in Applets wichtig ist) und höchstwahrscheinlich dort ist auch ein Overhead innerhalb der COM-Komponente für COM-Interop.

0

ist activexobjects die acivex Websites wie activex.microsoft.com immer schlagen