IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API, COM et SDKs Delphi Discussion :

ActiveX appelé par Javascript


Sujet :

API, COM et SDKs Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 147
    Par défaut ActiveX appelé par Javascript
    Bonjour,


    J'utilise un programme qui répétitivement (disons 10 fois par seconde) exécute le code javascript suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var proc = new ActiveXObject("xxxx.yyyy");
    return proc.Calculate(gxptTarget, gxptOutput, gxptParams, gxptModelInfo);
    Où xxxx.yyyy est un activeX censé exposé la méthode Calculate qui est de la forme (donnée en VB par le constructeur du prog en question):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public Function Calculate(ByRef gxptTarget As Variant, _
                              ByRef gxptOutput As Variant, _
                              ByRef gxptParams As Variant, _
                              ByRef gxptModelInfo As Variant) _  As Variant
    Je voudrais, en outre, pouvoir disposer des données envoyées par le prog (tous les variants envoyés sont des tableaux de réels) pour pouvoir les afficher dans Form1.chart sous Delphi.
    Non spécialiste, loin s'en faut, des objets com j'ai péniblement réussi dans un premier temps à créer une simple appli conventionnelle delphi (une simple et unique Form1) dans laquelle j'ai défini et exposé la méthode Calculate en créant un objet Automation et de fait, cela fonctionne (la procédure calcule est bien appelée et retourne des valeurs au prog). J'ai cependant un dernier problème: A chaque éxécution de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var proc = new ActiveXObject("xxxx.yyyy");
    L'ActiveX est créé, Calculate est donc appelée coté delphi grâce au serveur automation et une fenêtre Form1 et créée (et d'ailleurs détruite à la fin puisqu'elles ne s'accumulent pas: il n'y a toujours qu'un seule Form1 vivante,
    ce qui semblerait indiquer l'activeX est détruit par le prog à chaque appel).

    Comment faire en sorte que Form1 ne soit créée qu'au premier appel de calculate ? cela se définit-il au niveau du javascript (vérifier que l'objet existe pour ne pas le récréer si oui) ou au niveau Delphi ? Ou est-ce tout simplement impossible ?

    Quelqu'un a-t-il une idée ?

    Cordialement

    Eric BEAUMARD

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 938
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 938
    Par défaut
    var Proc doit simplement être défini en variable globale au script et non à l'intérieur de la fonction.

  3. #3
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 147
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    var Proc doit simplement être défini en variable globale au script et non à l'intérieur de la fonction.
    S'agissant de ce script je n'ai accès, dans le logiciel en question, qui est un exe,
    qu'à une fenêtre dans laquelle je peux taper mon script. Le logiciel appelle
    répétitivement le script en question et retourne à chaque fois à l'exe. Je ne vois pas comment maintenir un contexte (une var globale) dans ces conditions.
    Autrement dis, je ne peux écrire du javascript qu'à l'intérieur d'une fonction qui est appelé périodiquement par un exe duquel je ne controle rien et dont je n'ai pas non plus le source.

    Est-il impossible de maintenir un contexte au niveau de l'activeX ?
    (stocker des trucs quelque part en RAM par un exe qui servirait de tampon
    à l'activeX et qui dialoguerait avec lui et serait lui, permanent)

    Cordialement

    Eric

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 938
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 938
    Par défaut
    Un serveur automation contient un compteur d'accès. Si le compteur = 0 ET que l'application serveur a été lancée automatiquement à l'établissement d'une connexion, le serveur est arrêté.

    Si le serveur a été démarré manuellement, il n'est jamais arrêté.

    Dans ton cas, soit tu le lances au démarrage de Windows (en tâche de fond, fenêtre minimisée, etc), soit à travers ton script avant new ActiveXObject("xxxx.yyyy").

    Ce qui donnerait quelque chose comme ceci (Je n'ai pas testé):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var oShell = new ActiveXObject("Shell.Application");
    oShell.ShellExecute("TonProg.exe", "", "", "open", 0);
     
    var proc = new ActiveXObject("xxxx.yyyy");
    return proc.Calculate(gxptTarget, gxptOutput, gxptParams, gxptModelInfo);
    Tu devras bien sûr t'assurer qu'une seule instance de ton prog est créé (Mutex)

  5. #5
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 147
    Par défaut
    Ce qui donnerait quelque chose comme ceci (Je n'ai pas testé):
    [CODE]var oShell = new ActiveXObject("Shell.Application");
    oShell.ShellExecute("TonProg.exe", "", "", "open", 0);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var proc = new ActiveXObject("xxxx.yyyy");
    return proc.Calculate(gxptTarget, gxptOutput, gxptParams, gxptModelInfo);
    Tu devras bien sûr t'assurer qu'une seule instance de ton prog est créé (Mutex)
    Bon, j'essaie de bien comprendre. J'aurais donc un TonProg.exe lancé
    par le script à chacune des ses exécutions. Je ne vois pas comment
    tester en Javascript l'existence de Tonprog.exe pour ne pas la lancer
    plusieurs fois. Donc, et ce n'est pas un pb, il suffirait peut-être de lancer
    TonProg.exe avant de lancer l'appli qui exécute le JavaScript.

    Tu dis donc qu'il n'est pas problématique de demander plusieurs création
    de l'activeX parce que le système gère la chose. Ok.

    Il faudra donc maintenant que j'arrive à envoyer des données
    de l'activeX vers TonProg.exe, et je ne veux pas passer pas un
    fichier. Alors comment faire ? TFileStream, zone RAM commune, etc. ?

    Qui a une idée ?

    Cordialement

    Eric

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 938
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 938
    Par défaut
    Je ne vois pas comment tester en Javascript l'existence de Tonprog.exe pour ne pas la lancer plusieurs fois. Donc, et ce n'est pas un pb, il suffirait peut-être de lancer TonProg.exe avant de lancer l'appli qui exécute le JavaScript.
    C'est exactement ce que je t'ai proposé. (Sinon une gestion par Mutex côté Delphi qui fait un Halt de la 2ème instance)

    Tu dis donc qu'il n'est pas problématique de demander plusieurs création de l'activeX parce que le système gère la chose.
    Parlons plutôt de connexion. La création est implicite si (et uniquement si) le serveur n'est pas encore lancé.

    Il faudra donc maintenant que j'arrive à envoyer des données de l'activeX vers TonProg.exe
    Du coup je ne comprend plus la finalité. Tu dis que tu as créé un serveur COM en Delphi dans lequel tu as exposé la procedure Calculate. Depuis cette procédure, tu peux afficher ce que tu veux.

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/03/2009, 20h06
  2. appeler une action par javaScript
    Par khaledirb7 dans le forum Struts 1
    Réponses: 3
    Dernier message: 14/08/2007, 21h57
  3. Appel de controle ActiveX personnalise depuis javascript
    Par ay1@duclert.org dans le forum Windows
    Réponses: 1
    Dernier message: 23/05/2007, 15h55
  4. Appel Méthode 4D par Javascript
    Par mxh77 dans le forum 4D
    Réponses: 2
    Dernier message: 02/10/2006, 14h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo