none
Wie rufe ich per Javascript eine IDL-Funktion eines OCXes auf einer HTML-Seite auf RRS feed

  • Frage

  • Wie rufe ich in einer HTML-Seite per Javascript eine IDL-Funktion eines OCXes auf.
    Die Website enthält ein iframe-Element, und dort wird eine html-Seite geladen, die ein object-Element mit einem OCX-Control beinhaltet. In dem OCX ist eine IDL-Funktion Loadpage() enthalten, und diese Funktion soll per Javascript aus der Main-Page aufgerufen werden.
    Das OCX lässt sich mit folgendem Statement erreichen:
    var objOcx = document.getElementById("iframe_ocx").contentDocument.getElementById("ebalbaax");
    ... und in der objOcx-Variablen wird die Loadpage-Methode angezeigt, doch ich konnte noch keine Javascript-Formulierung entdecken, um die Funktion aufzurufen. Ich hab diverse "intuitive"-Schreibweisen ausprobieren, z.B.:
    document.getElementById("iframe_ocx").contentDocument._DElalbaax.Loadpage("<params>")
    document.getElementById("iframe_ocx").contentDocument.getElementById("ebalbaax").Loadpage("<params>")
    document.getElementById("iframe_ocx").contentDocument.getElementById("ebalbaax").methods.Loadpage("<params>")
    ... doch keine funktioniert.
    Frage: Wie sieht das korrekte Statement aus?
    Vielen Dank im voraus für den entschreidenden Hinweis :-)
    Dienstag, 16. Februar 2021 12:23

Alle Antworten

  • Hi,

    jesses, ich wusste gar nicht, dass das überhaupt noch existiert :)

    Du weißt schon, dass das Konstrukt OCX, ActiveX, ... in Browsern sowas von tot ist, oder?

    Generell (wenn Du mit Uraltsachen wie dem IE arbeitest) sollte der Aufruf schon klappen.

    <object classid="clsid:..." codebase="..."></object>
    
    <script type="text/javascript">
    function machWas()
    {
    var objOCX = ...;
        objOCX.MethodenName( <Parameter> );
    }
    </script>

     

    Siehe dazu bspw.: Calling Activex Control 's Functions from javascript

    Was natürlich auch immer passieren kann, sind Berechtigungsprobleme. Hier solltest Du mal schauen, ob die Developer Tools im IE (F12 drücken) dir einen Fehler zeigen.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Dienstag, 16. Februar 2021 13:52
    Moderator
  • Hallo Stefan,
     vielen Dank für deine schnelle Rückmeldung :-)
    >>>
    Jesses, ich wusste gar nicht, dass das überhaupt noch existiert :)
    Du weißt schon, dass das Konstrukt OCX, ActiveX, ... in Browsern sowas von tot ist, oder?
    <<<
     Ja, das ist mir bekannt! Es handelt sich aber nicht um eine NEUE Anwendung, sondern um eine URALTE, die ich ca. 2002(!) geschrieben hatte (und DAMALS war das alles "modernste Hightech"!). Im Laufe der Jahre war dieses Produkt bei diversen Kunden im Einsatz und hat diverse Windows-/IE-Versionsupdates problemfrei überlebt... sprich: Die Anwendung läuft und läuft und läuft! Wir haben das Produkt seit ca. 10 Jahren abgekündigt, und die meisten Kunden haben es inzwischen ersetzt, aber: EIN Kunde ist weiterhin von der Anwendung voll begeistert und will sie ca. noch 3 Jahre lang einsetzen (never change a running system). Allerdings gab es jetzt beim Umstieg von Win7/IE11 auf Win10/IE11 eine merkwürdige Verhaltensänderung des IE, und zwar, dass beim Neuladen des Images im iFrame (beim Blättern durch das Dokument) ein störendes Flackern auftritt (vielleicht durch irgendeine neue Anzeigeoptimierung im Win/IE?!?!). Der Fachbereich konnte sich aber für dieses Flackern so überhaupt nicht begeistern und hat eine Optimierung beauftragt. Und die einzige Lösung, die mir eingefalen ist, um das Blätter-Flackern wegzukriegen, ist, das OCX DIREKT mit dem Seitenneuladen zu beauftragen, um den IE (und sein Optimierungsverhalten) zu umgehen. Und deshalb brauche ich diesen Javascript-DOM-IDL-Aufruf.
    Langer Rede, kurzer Sinn!
     Ich hab deinen Vorschlag:
    objOcx.Loadpage(strUrlX);
    ... erneut ausprobiert, doch es kommt (in F12-Debugger) ein Javascript-Fehler:
    >>>
    SCRIPT16389:
    lbacpfs.js (107,9)
    <<<
     Ich hab mir dann deinen Link angeschaut:
    https://stackoverflow.com/questions/12246391/calling-activex-control-s-functions-from-javascript
    ... und dort wird die Funktion nicht über objOcx aufgerufen, welches über die DOM-Hierarchie ermittelt wurde, sondern es wird ein neues Objekt generiert:
    >>>
    var myobj = new ActiveXObject('MyActiveX.MyObj');
        myobj.getText('test');
    <<<
    Also hab ich diesen Ansatz mal mit den meinigen Daten ausprobiert:
    >>>
    var objOcx = new ActiveXObject('macros.EbalbaaxCtrl.1');
        objOcx.Loadpage('pageno=2');
    <<<
    ... wobei objOcx tatsächlich das korrekte Objekt enthält, wobei der Aufruf Loadpage aber weiterhin mit einem Fehler endet:
    >>>
    SCRIPT165535...
    <<<
    Fazit: Einen Schritt bin ich weiter, doch der allerletzte Schritt fehlt immer noch :-(
    Mittwoch, 17. Februar 2021 08:31
  • ... obwohl: Die Vorgehensweise, ein neues Objekt zu erzeugen, ist m.E. verkehrt, da schon 3 OCX-Instanzen am Laufen sind (es werden 3 Seiten in 3 iFrames nebeneinander angezeigt). Und durch das "new ActiveXObject" würde nun eine 4.Instanz angelegt, die in der Luft hängt.

    D.h.: die Loadpage-Funktion muss in demjenigen objOcx aufgerufen werden, welches aus der DOM-Hierarchie ermittelt wird.

    Mittwoch, 17. Februar 2021 16:47
  • D.h.: die Loadpage-Funktion muss in demjenigen objOcx aufgerufen werden, welches aus der DOM-Hierarchie ermittelt wird.

    Korrekt. Das verlinkte Beispiel erstellt eine neue Instanz. Bei meinem Code habe ich das explizit offen gelassen, da Du dort ja die Instanz aus dem DOM einsetzen solltest.

    Poste bitte mal die exakte und vollständige Fehlermeldung beim Aufruf deiner Loadpage Methode.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Mittwoch, 17. Februar 2021 17:04
    Moderator