2008-11-06 7 views
0

Je peux utiliser le modèle MFC/ActiveX de VS08 pour créer un objet C++ ActiveX que je peux charger dans une page HTML et un script avec Javascript. Mais je n'arrive pas à comprendre comment créer une interface qui me permet d'appeler des méthodes personnalisées sur mon composant avec Javascript.Comment construire un objet ActiveX en C++ qui peut être scripté en utilisant Javascript

Pourriez-vous s'il vous plaît me dire comment accomplir cela? J'ai passé plus de deux heures sur google sans aucune chance.

Merci.

Répondre

2

Je ne suis pas très familier avec l'emballage MFC ActiveX, mais je peux répondre à la question dans le sens général:

Un objet COM avec une interface qui est dérivé de IDispatch peut être appelé par des langages d'automatisation (par exemple : Javascript). Les méthodes doivent également être "compatibles avec l'automatisation", ce qui signifie que les paramètres sont convertibles en type VARIANT ou explicitement de type VARIANT. Notez que pour les paramètres in/out, le type doit être VARIANT * pour que l'automation "branchement" fonctionne. Je ne sais pas comment rendre l'objet ActiveX accessible dans le script client (par exemple: l'incorporer dans la page), mais s'il a une seule interface dérivée de IDispatch, cela le rend accessible depuis Javascript (et d'autres langages d'automatisation). J'espère que cela aide ...

1

Cela fonctionne pour intégrer votre conteneur ActiveX dans une page html et l'invocation d'une méthode:

<html> 
<body> 
<object height="0" width="0" id="myControl" classid="CLSID:AC12D6F8-AEB7-4935-B3C9-0E4FB6CF7FB1" type="application/x-oleobject"> 
</object> 
<script> 
    var activexObj = document.getElementById('myControl'); 
    if(activexObj != null) 
    { 
     var result = myControl.myMethod(); 
     document.write("Result: " + result + "<br/>"); 
    } 
    else 
    { 
     document.write("ActiveX component not found!<br/>"); 
    } 
</script> 
</body> 
</html> 
1

Si vous utilisez le modèle MFC VS08 ActiveX, vous pouvez voir un extrait comme celui-ci dans le fichier .h de votre commande (dans la déclaration de classe, il est protégé):

afx_msg void AboutBox(); 

DECLARE_DISPATCH_MAP() 

Et l'un comme celui-ci dans le fichier .cpp:

// Dispatch map 

BEGIN_DISPATCH_MAP(CActiveXOutlookCtrl, COleControl) 
    DISP_FUNCTION_ID(yourCtrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE) 
END_DISPATCH_MAP() 

Je n'ai jamais eu à utiliser ceci, mais c'est votre interface de répartition - autrement dit les méthodes sur votre objet que les autres peuvent appeler. Qu'est-ce que cela signifie:

  • "AboutBox" est le nom qu'ils utilisent pour l'appeler.
  • DISPID_ABOUTBOX est un identifiant entier pour la fonction (je pense que c'est arbitraire, j'utiliserais un nombre positif car beaucoup de négatifs sont pris par défaut). AboutBox est le nom de la méthode.
  • VT_EMPTY est le type de retour de la méthode.
  • VTS_NONE est le type de paramètres requis.

Il y a aussi DECLARE_MESSAGE_MAP() et DECLARE_EVENT_MAP(), qui pourraient être à propos de ce que vous voulez aussi.

+0

une correction triviale, DECLARE_DISPATCH_MAP() doit suivre la déclaration de la fonction. –

Questions connexes