EXEMPLE : MFCAxs.exe implémente un à l'aide de MFC Active Script Host

Traductions disponibles Traductions disponibles
Numéro d'article: 168214 - Voir les produits auxquels s'applique cet article
Cet article a été archivé. Il est proposé « en l'état » et ne sera plus mis à jour.
Agrandir tout | Réduire tout

Sommaire

Résumé

MFCAxs.exe est un échantillon contenant MfcAxscrVb. MfcAxscrVb est un ordinateur hôte de Active Scripting exemple pédagogiques écrite à l'aide de MFC. Il héberge la DLL de VBScript ; toutefois, les mécanismes d'Active Scripting sont génériques vers n'importe quel moteur Active Scripting. MfcAxscrVb présente juste une façon possible de fournissent des objets de l'expédition à partir de l'ordinateur hôte, implémenter des interfaces de Active Scripting du ordinateur hôte et connecter les messages de fenêtres dans l'ordinateur hôte avec des événements déclenchés pour le moteur de script.

MfcAxscrVb inclut un fichier de projet et de l'espace de travail Visual C++ 5.0. Bien qu'aucun fichier Make compatible VC ++ 4.2 ou mdpfile n'est fourni, le code source pour MfcAxscrVb est compatible avec MFC 4.2b.

Conditions préalables: COM, Automation

Plus d'informations

Le fichier suivant est disponible au téléchargement à partir du centre de téléchargement Microsoft :
MFCAxs.exe
Pour plus d'informations sur la façon de télécharger des fichiers de support technique Microsoft, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la base de connaissances Microsoft :
119591Procédure pour obtenir des fichiers de support technique Microsoft auprès des services en ligne
Microsoft a analysé ce fichier pour les virus. Microsoft utilisé les logiciels de détection de virus les plus récentes ne sont associé à la date à laquelle le fichier a été validé. Le fichier est stocké sur des serveurs sécurisés, empêchant toute modification non autorisée du fichier.

L'exemple en cours d'exécution

Lorsque vous exécutez l'exemple MfcAxscrVb vous remarquerez un contrôle edit volumineux dans le coin supérieur gauche de l'application. Vous pouvez coller ou type de script dans cette fenêtre et sélectionnez le "Exécuter script" bouton pour appeler le script. Plusieurs scripts de test sont fournis pour vous dans les fichiers Script.txt et testevents.txt.

Exposition de l'hôte : d'expédition des objets

Le principal objectif de cet exemple est l'implémentation d'objets d'expédition à l'aide de MFC. La raison à cela est simple. Un langage de script n'est pas grande utilité s'il n'y a pas quoi que ce soit au script.

La technologie de base dont tous les Active Scripting dépend est plus certainement celle d'Automation. Une connaissance solide de Automation est absolument nécessaire avant de tenter toute ordinateur hôte Active Scripting du code. Il y a plusieurs références bonne pour Automation : chapitres 14 et 15 du Brockshmidt "Inside OLE, «chapitre 11 de «Inside COM l'ouvrage de Dale Rogerson» et «Référence du programmeur OLE Automation».

CCmdTargetPlus :

Ce dont vous avez besoin sont certains objets qui permettent des propriétés pouvant faire l'objet d'un script et des méthodes via IDispatch mais génèrent également des événements pouvant faire l'objet d'un script. MFC accomplit sans aucun doute l'essentiel des tâches rébarbatives pour vous lors de l'implémentation d'interfaces de dispatch pour un objet COM. Toutefois, la seule classe MFC prend en charge les interfaces de dispatch entrant et sortant des interfaces de dispatch ou récepteurs d'événements, est COleControl. COleControl est bien trop encombrants pour définir les éléments. Simplement, vous souhaitez que les événements, une interface de dispatch, puis tapez informations. VBScript a besoin de lire les informations de type pour les objets d'expédition qui prend en charge les événements. Vous pourriez créer ce à la volée, ou créer une bibliothèque de type statique pour les objets d'expédition de votre ordinateur hôte et obtenir le ITypeInfo pour chaque objet individuel.

Bien que probablement pas nécessaire, MfcAxscrVb possède une classe de base appelée CCmdTargetPlus prend en charge de ces trois éléments : expédiez interface, les points de connexion avec une table d'événements de style de contrôle et les informations de type facilement accessibles par le biais de IProvideClassInfo. La plupart du code dans CmdTargetPlus a été ajoutée pour permettre pour les représentations de événement, qui utilise Ajout d'événements pour les beaucoup plus facile de classes dérivées.

Expédier les objets :

Tous les objets de dispatch ordinateur hôte fournis sont implémentées à l'aide de CCmdTargetPlus. Il y a quelques choses dont il a besoin pour travailler également. Un des objets d'expédition (CAButtonDispatch, CBButtonDispatch, etc.) pour voir un passe-partout sur ce qui est nécessaire. Un bref récapitulatif sur modèle d'objet du MfcAxscrvb est répertorié à la fin de ce document.

Si vous ajoutez vos propres objets, veillez à vérifier pour trois GUID unique pour l'expédition primaire et les interfaces de principaux événements et pour le clsid de l'objet dans la somme. Cette opération doit être effectuée dans le fichier d'implémentation et dans le fichier .odl. (Couper et coller permet ici). Couper et coller toutes les macros d'Assistant classe et les modifiez le nouveau nom de classe. Assistant de classe est très particulière, mais si vous suivez tout simplement droit .odl, .h et .cpp fichiers, vous pouvez l'utiliser pour ajouter de nouveaux événements, propriétés, et méthodes pour votre expédition des objets comme s'il s'agissait d'un OLE contrôle MFC. C'est de pratique.

MfcAxscrVb conserve l'objet qui implémente les mécanismes d'expédition distincts de l'objet MFC, qui est effectivement faire. Par exemple, la boîte de dialogue comporte un bouton appelé «AButton,"qui est scriptable. L'objet bouton MFC est CButton. La classe dérivée de CCmdTargetPlus, CAButtonDispatch, est séparée et distincte. Il s'agit d'un point clé. Uniquement ce que le programmeur ordinateur hôte explicitement choisit exposer pour les objets de base MFC et les contrôles de Windows sera scriptable.

CEventsButton, CEventsEdit, CeventsListBox :

Pour les événements, il doit être un code qui répond à un Windows événement--disons, un clic de bouton--et génère un événement pour le moteur de script. (N'oubliez pas qu'un événement est une intervention Invoke sur une interface gérée par les points de connexion dans l'objet ordinateur hôte.) Cet exemple réalise cette authentification en ajoutant des gestionnaires de messages MFC standard en objets dérivées de classes différentes. Chacun de ces gestionnaires doit simplement appeler FireEvent (avec l'aimable autorisation de code ajouté à CCmdTargetPlus) sur l'objet de répartition. Tout le reste s'effectue automatiquement.

Dans la mesure où l'objet de répartition et l'objet de fenêtre MFC réel sont séparés dans cet exemple, le parent de la boîte de dialogue doit explicitement relient entre eux les deux. Pour cela dans le constructeur Mfcaxscrvbdlg.

Éléments nommés

Une fois que vous avez des objets de l'expédition, vous devez configurer les de sorte que le moteur de script qui leur est informé. La collection de tous les objets nommés expédition connaît le moteur de script est appelée «Namespace de script». Éléments sont ajoutés à l'espace de noms de script par le biais de la méthode IActiveScript::AddNamedItem. Comme je l'ai mentionné précédemment, il est obligation d'ordinateur hôte implémentation IDispatch pour l'objet et la prise en charge des informations de type via ITypeInfo pour l'objet. Lorsque le moteur de script doit résoudre une référence à un élément nommé, il utilise la méthode IActiveScriptSite::GetItemInfo pour demander un pointeur IUnknown (qui elle demande principalement IDispatch) et un pointeur ITypeInfo.

Pas tout ce qu'un ordinateur hôte souhaite scriptable doit être un élément nommé. L'ordinateur hôte ont généralement une hiérarchie d'objets, où les sous-objets sont accessibles via un objet de niveau supérieur. Une métaphore courante est l'application-> document-> hiérarchie de l'élément, où l'objet document est accessible à partir de l'objet application de niveau supérieur comme une propriété IDispatch de l'objet application lui-même. De la même manière, l'objet document lui-même expose plusieurs sous-objets et chacun est un élément que vous pouvez obtenir par l'intermédiaire d'un tableau de l'élément ou autre contrivance.

À l'aide de ce régime, le moteur de script est suffisamment intelligent pour accéder à un sous-élément lorsque le code de script indique les opérations suivantes sans avoir besoin de document ou élément à ajouter à l'espace de noms de script :
Set Obj = Application.Document.Item(1)
				
en tant que les sous-objets sont exposées en tant que get-propriétés de leur objet parent, le moteur de script détecte correctement. Il est intéressant, le moteur de script est en mesure de «Supposons» l'élément de niveau supérieur dans la hiérarchie. Cela signifie que si application est déclarée en tant que l'élément de niveau supérieur, il suffit de dire les informations suivantes pour le code de script préalable :
Set Obj = Document.Item(1)
				
Ceci est exactement comment Internet Explorer 3.0 vous permet au code de script dans le contexte de l'objet Window sans toujours faisant précéder toutes les références aux objets avec "Fenêtre". Un script ordinateur hôte doit identifier l'élément de script de niveau supérieur dans l'appel à AddNamedItems à l'aide de l'indicateur SCRIPTITEM_GLOBALMEMBERS. Ce que généralement n'est pas clair par documentation Active Scripting, toutefois, nommé uniquement les éléments peut prendre en charge des événements. À l'aide de l'exemple ci-dessus, il n'existe aucune syntaxe à dire les opérations suivantes pour gérer un événement dans un élément particulier :
   Sub Application.Document.Item(1)_OnEvent ' this doesn't work!
				
so, MfcAxscrvbdlg, car nous souhaitons pouvoir gérer les événements de chaque objet dans la hiérarchie, chaque objet est ajouté comme un élément nommé. Chaque objet est également accessible via l'objet de scripteur niveau supérieur (la boîte de dialogue elle-même), qui ne prend pas en charge les événements actuellement.

Contrôle WebBrowser :

Dans cet exemple, le script ordinateur hôte n'expose qu'un seul objet externe à l'espace de noms de script. Il s'agit du contrôle WebBrowser hébergé dans la boîte de dialogue par prise en charge de MFC par défaut contrôle la relation contenant-contenu. Tout ce dont vous avez besoin est un AddRef vous expédiez pointeur vers le contrôle et que vous avez défini. Pour les événements, l'objet externe doit exposer un pointeur ITypeInfo une certaine manière. MfcAxscrVb obtient cela n'est. En dernier recours, un ordinateur hôte a pu lire les informations de l'objet type-lui-même pour exposer un ITypeInfo. Heureusement, le contrôle WebBrowser prend en charge GetClassInfo, sorte MfcAxscrVb ne fait pas cela.

Si vous souhaitez ajouter d'autres objets automation externe à l'espace de noms, tout ce qui est généralement nécessaire consiste à obtenir une interface IUnknown à l'aide de CoCreateInstance. Vous pouvez également l'ordinateur hôte peut prendre en charge un moyen générique pour l'obtention d'objets externes, mais qui n'ont pas besoin de devez événements gérés. Dans Visual Basic, la fonction pour ce faire est appelée CreateObject.

Obtention d'autres applications: HostCreateObject

Autre que le jeu de propriétés utilisé pour exposer tous les objets enfants, l'objet de scripteur principale (la classe de boîte de dialogue elle-même) n'expose qu'une méthode spéciale. Cette méthode montre qu'un moyen simple de simulation CreateObject fonction de Visual Basic. Notez que la méthode est nommée HostCreateObject pour souligner que cette méthode n'est pas fournie gratuitement par le moteur de script, mais l'ordinateur hôte doit l'implémenter lui-même. Certains hôtes clairement n'aurait pas offrir cette possibilité pour des raisons de sécurité, IE3 est un bon exemple. L'objectif principal de HostCreateObject est pour renvoyer le pointeur de dispatch de l'objet demandé. Une fois que le moteur de script a le pointeur de dispatch, il sait que faire à partir de là.

Remarque : en tant que de la version 2.0, les moteurs VBScript et JScript prennent désormais en charge les CreateObject qu'une fonction intégrée. L'ordinateur hôte n'a plus besoin implémenter cette fonction. Cette fonction testerez toutefois, un objet pour vous assurer qu'elle est sécurisé pour le script avant d'autoriser l'objet à utiliser. Objets eux-mêmes jugent sécurisé pour l'écriture de scripts en prenant en charge l'interface IObjectSafety ou marquage les entrées de Registre Component Category appropriées pour Safe For Scripting. Reportez-vous à la base de connaissances Microsoft pour plus d'informations.

Prise en charge de l'Assistant classe

Le dernier bit peu de trickery dans MfcAxscrVb est manipulations apportées pour prendre en charge de ClassWizard. Assistant de classe, techniquement n'est pas «passives». Il est simplement mentalement contesté. Il est très pratique pour ce qu'il effectue, mais n'oubliez pas qu'il recherche simplement aveuglément fichiers recherchez les commentaires de ClassWizard spéciales. Si vous respectez le format de COleControl, vous pouvez simplement sur get suite à l'utilisation de Automation et les événements de ClassWizard onglets.

Une complication est que MfcAxscrVb utilise dérivation dans certains de sa hiérarchie d'objets. Tous les objets de bouton sont dérivés d'un objet CButtonDispatch commun qui expose des propriétés et méthodes, que prennent en charge toutes les de laquelle il serait individuellement. Toutefois, lorsqu'il s'agit de temps de remplir le fichier .odl, chaque objet doit contenir toutes les propriétés et méthodes de la classe parent. Il va sans dire que cela va confondez Assistant classe lorsqu'il s'agit de temps pour numéroter les DISPID. Si vous utilisez Assistant classe, assurez-vous que vous vérifiez les DispId générés à deux endroits : le fichier .odl pour la classe automation et l'énumération à l'intérieur de la définition de classe. Lorsque vous travaillez avec les classes dérivées de bouton, il est facile de voir le même DISPID affecté à plusieurs propriétés et méthodes. Il est beaucoup plus facile de corriger les DISPID, cependant, que pour ajouter tous les éléments en zéro, donc la fonctionnalité a été laissée dans MfcAxscrVb.

Grâce à la prise en charge de l'améliorée de Visual C++ 5.0 IDL méthodes et propriétés par l'intermédiaire de ClassView, il est virer jusqu'à si ClassWizard est nécessaire ou non. Mais MfcAxscrVb prend il en charge pour l'instant. Profitez de.

Annexe a : modèle d'objet

Scripteur :

Il s'agit de l'objet master à partir de laquelle tous les autres objets sont dérivés. Il est «IMfcaxscrvbDlg» dans le fichier .odl mais est ajouté en tant que l'élément nommé «Scripteur.» Elle possède une seule méthode, HostCreateObject, décrit ci-dessus.

Objets Button :

AButton BButton, CancelButton, nommés OKButton, RunScript alors qu'il

Propriétés
  • Légende : Texte de l'image du bouton.
Méthodes Appuyez sur : Opère comme si le bouton ont été enfoncé.
  • Appuyez sur : Opère comme si le bouton ont été enfoncé.
Événements
  • OnClick : Déclenchés lorsque vous appuyez sur le bouton.
  • OnMouseOver : Déclenchés lorsque la souris survole bouton.
  • OnFocus(bSet) : Déclenchés lorsque focus est donné ou prélevés sur le bouton.
BroCon :

BroCon est le nom du contrôle WebBrowser dans la boîte de dialogue. Il prend en charge toutes les propriétés et méthodes en procédant comme décrit dans Internet Client SDK/ActiveX SDK pour le contrôle WebBrowser.

EditCon :

Méthodes
  • AppendLine(strToAdd) : Ajoute strToAdd à la fin de la fenêtre de modification de texte.
  • InsertLine (strToAdd, noù): ajoute strToAdd à #nWhere de ligne.
  • RemoveLine(nWhere) : Supprime # nWhere de ligne de fenêtre d'édition.
Événements
  • OnMouseOver : Déclenchés lors de la souris survole de fenêtre.
  • OnChar(strChar) : Déclenchés lorsque strChar de caractère est entré dans la fenêtre.
  • OnFocus(bSet) : Déclenchés lorsque focus est donné ou prélevés sur le bouton.
Lbox:

Méthodes
  • AddString(strIn) : Ajoute StrIn dans la zone de liste.
  • EffacerListe : Efface toutes les chaînes à partir de la zone de liste.
  • RemoveString(strRemove) : Supprime la première instance de StrRemove et le supprime de la zone de liste.
  • SelectString(strSelect) : Sélectionne la chaîne spécifiée par strSelect.
Événements
  • OnMouseOver : Déclenchés lors de la souris survole de fenêtre.
  • OnFocus(bSet) : Déclenchés lorsque focus est donné ou prélevés sur le bouton.
  • OnSelCancel(strCancelled) : Lorsque sélection est annulée dans un strCancelled élément de zone de liste.
  • OnSelChange(strChange) : Quand un strChange élément de zone de liste est sélectionné par l'utilisateur.

Propriétés

Numéro d'article: 168214 - Dernière mise à jour: jeudi 30 janvier 2014 - Version: 2.2
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Internet Explorer 3.01
  • Microsoft Internet Explorer 3.02
  • Microsoft Internet Explorer 4.0 Édition 128 bits
  • Microsoft Internet Explorer 4.01 Service Pack 2
  • Visual Basic, Scripting Edition 1.0
  • Microsoft Visual Basic, Scripting Edition 1.1
  • Visual Basic, Scripting Edition 2.0
  • Microsoft Foundation Class Library 4.2 sur le système suivant
    • Microsoft Visual C++ 5.0 Édition Entreprise
    • Microsoft Visual C++ 5.0 Édition Professionnelle
Mots-clés : 
kbnosurvey kbarchive kbmt kbdownload kbfile kbinfo kbsample KB168214 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 168214
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com