ΔΕΙΓΜΑ: MFCAxs.exe υλοποιεί μια ενεργή χρήση MFC Script Host

Μεταφράσεις άρθρων Μεταφράσεις άρθρων
Αναγν. άρθρου: 168214 - Δείτε τα προϊόντα στα οποία αναφέρεται το συγκεκριμένο άρθρο.
Ανάπτυξη όλων | Σύμπτυξη όλων

Σε αυτήν τη σελίδα

Περίληψη

MFCAxs.exe είναι ένα δείγμα που περιέχει MfcAxscrVb. MfcAxscrVb είναι ένα δείγμα οδηγιών ενεργές δέσμες ενεργειών κεντρικού γραφτεί χρησιμοποιώντας MFC. Αυτό βρίσκεται το αρχείο DLL του VBScript, ωστόσο, οι μηχανισμοί ενεργές δέσμες ενεργειών είναι γενικό μηχανισμό τις ενεργές δέσμες ενεργειών. MfcAxscrVb εμφανίζει μόνο έναν τρόπο παρέχουν εκτροπής αντικείμενα από τον κεντρικό υπολογιστή, να υλοποιούν διασυνδέσεις ενεργές δέσμες ενεργειών του κεντρικού υπολογιστή και να συνδέσετε τα μηνύματα των windows στον κεντρικό υπολογιστή με τα συμβάντα που ενεργοποιείται στο μηχανισμό δέσμης ενεργειών.

MfcAxscrVb περιλαμβάνει ένα αρχείο χώρου εργασίας και το έργο της Visual C++ 5.0. Παρόλο που παρέχεται χωρίς συμβατή makefile 4.2 VC ++ ή mdpfile, ο πηγαίος κώδικας για MfcAxscrVb είναι συμβατός με MFC 4.2b.

Προϋποθέσεις: COM, αυτοματοποίηση

Περισσότερες πληροφορίες

Το ακόλουθο αρχείο είναι διαθέσιμο για λήψη από το Κέντρο λήψης της Microsoft (Download Center):
MFCAxs.exe
Για περισσότερες πληροφορίες σχετικά με τον τρόπο λήψης αρχείων υποστήριξης της Microsoft, κάντε κλικ στον αριθμό του άρθρου παρακάτω για να προβάλετε το άρθρο της Γνωσιακής Βάσης της Microsoft (Knowledge Base):
119591Τρόπος απόκτησης αρχείων υποστήριξης της Microsoft από ηλεκτρονικές υπηρεσίες
Η Microsoft εξέτασε το αρχείο αυτό για ιούς. Η Microsoft χρησιμοποίησε το πιο πρόσφατο λογισμικό εντοπισμού ιών που ήταν διαθέσιμο κατά την ημερομηνία δημοσίευσης του αρχείου. Το αρχείο είναι αποθηκευμένο σε διακομιστές με ενισχυμένη ασφάλεια, οι οποίοι βοηθούν στην αποτροπή μη εξουσιοδοτημένων αλλαγών στο αρχείο.

Εκτέλεση του δείγματος

Όταν εκτελείτε το δείγμα MfcAxscrVb θα παρατηρήσετε ένα στοιχείο ελέγχου επεξεργασίας μεγάλων στην επάνω αριστερή γωνία της εφαρμογής. Μπορείτε να επικολλήσετε ή τύπος δέσμης ενεργειών σε αυτό το παράθυρο και επιλέξτε το "Εκτέλεση Script" κουμπί για να ενεργοποιήσετε τη δέσμη ενεργειών. Πολλές δέσμες ενεργειών δοκιμής παρέχονται στα αρχεία Script.txt και Testevents.txt.

Εκθέσετε τον κεντρικό υπολογιστή: αποστολής αντικειμένων

Το κύριο σημείο εστίασης για αυτό το δείγμα είναι η υλοποίηση των αντικειμένων εκτροπής χρησιμοποιώντας MFC. Η αιτία για αυτό είναι απλή. Μια γλώσσα δέσμης ενεργειών δεν είναι πολύ χρησιμοποιείται εάν δεν υπάρχει τίποτα για τη δέσμη ενεργειών.

Η βασική τεχνολογία βάσει του οποίου εξαρτάται όλες τις ενεργές δέσμες ενεργειών είναι οι περισσότεροι βέβαιο ότι του αυτοματισμού. Συμπαγής εργασίας γνώση του αυτοματισμού είναι απολύτως απαραίτητο, πριν να προσπαθήσετε να τον κωδικό οποιουδήποτε κεντρικού υπολογιστή ενεργές δέσμες ενεργειών. Υπάρχουν αρκετά καλή αναφορές για αυτοματοποίηση: κεφάλαια 14 και 15 του Brockshmidt του "εσωτερικά OLE," Κεφάλαιο 11 Dale Rogerson "στο εσωτερικό COM" και "Αναφορά προγραμματιστή του OLE Automation".

CCmdTargetPlus:

Ό, τι χρειάζεστε είναι ορισμένα αντικείμενα, τα οποία επιτρέπουν προγραμματιζόμενα ιδιότητες και μεθόδους μέσω του IDispatch αλλά επίσης να δημιουργήσει προγραμματιζόμενα συμβάντα. MFC κάνει σίγουρα μεγαλύτερο μέρος της εργασίας grunt για εσάς όταν υλοποιούν διασυνδέσεις εκτροπής για ένα αντικείμενο COM. Ωστόσο, η μόνη κλάση MFC που υποστηρίζουν και οι δύο διασυνδέσεις εκτροπής εισερχόμενων και εξερχόμενων διασυνδέσεις εκτροπής ή δέκτες συμβάντων, είναι COleControl. COleControl είναι πολύ bulky πολύ για το τι θέλετε. Απλώς θέλετε συμβάντα, μια διασύνδεση εκτροπής, και πληκτρολογήστε τις πληροφορίες. VBScript πρέπει να διαβάσει πληροφορίες τύπου για αντικείμενα εκτροπής που υποστηρίζει συμβάντα. Δημιουργείτε ήταν είτε αυτό στη διάρκεια της λειτουργίας του, ή δημιουργία στατικού τύπου βιβλιοθήκης για αντικείμενα της αποστολής του κεντρικού σας υπολογιστή και αποκτήστε το ITypeInfo για κάθε μεμονωμένο αντικείμενο.

Ενώ μάλλον δεν είναι απαραίτητο, MfcAxscrVb έχει μια βασική κλάση που ονομάζεται CCmdTargetPlus που υποστηρίζει αυτά τα τρία τμήματα: αποστολής διασύνδεσης, σημεία σύνδεσης με στυλ ελέγχου συμβάντων χάρτη και εύκολη πρόσβαση σε τύπο πληροφοριών μέσω IProvideClassInfo. Τα περισσότερα από τον κώδικα σε CmdTargetPlus προστέθηκε για το συμβάν χάρτες, που πραγματοποιεί Προσθήκη συμβάντα που προκύπτουν κλάσεις πολύ πιο εύκολη.

Αντικείμενα εκτροπής:

Όλα τα αντικείμενα που παρέχονται από κεντρικό υπολογιστή αποστολής υλοποιούνται χρησιμοποιώντας CCmdTargetPlus. Υπάρχουν μερικά πράγματα που πρέπει να κάνετε για να λειτουργήσει σωστά. Αναφερθείτε σε οποιοδήποτε από τα αντικείμενα της αποστολής (CAButtonDispatch, CBButtonDispatch και ούτω καθεξής) για μια τυποποιημένη σε τι είναι απαραίτητο. Μια σύντομη rundown του μοντέλου αντικειμένου του MfcAxscrvb παρατίθεται στο τέλος αυτού του εγγράφου.

Εάν προσθέσετε τα δικά σας αντικείμενα, φροντίστε να ελέγξετε ξανά για τρία μοναδικά GUID για το πρωτεύον εκτροπής και διασυνδέσεις πρωτεύον συμβάντα και για το clsid για το αντικείμενο στο άθροισμα. Αυτό πρέπει να γίνει στο αρχείο εφαρμογής και στο αρχείο .odl. (Αποκοπή και επικόλληση βοηθά εδώ.) Αποκοπή και επικόλληση όλες τις μακροεντολές Οδηγός κλάσης και αλλάξτε τους στο νέο όνομα κλάσης. Class Wizard is very particular, but if you follow everything just right in the .odl, .h, and .cpp files, you can use it to add new events, properties, and methods to your dispatch object as if it were an MFC OLE Control. This is sort of handy.

MfcAxscrVb keeps the object implementing the dispatch mechanisms separate from the MFC object, which it is actually referring to. For example, the dialog box has a button called the "AButton," which is scriptable. The MFC button object is CButton. The CCmdTargetPlus-derived class, CAButtonDispatch, is separate and distinct. This is a key point. Only what the host programmer explicitly chooses to expose for basic MFC objects and Windows controls will be scriptable.

CEventsButton, CEventsEdit, CeventsListBox:

For events, there needs to be some code that responds to a Windows event-- say, a button click--and generates an event for the script engine. (Remember an event is a dispatch Invoke on an interface handled by connection points in the host object.) This sample accomplishes this by adding standard MFC message handlers into objects derived from the various classes. Each of these handlers merely has to call FireEvent (courtesy of the code added to CCmdTargetPlus) on the dispatch object. Everything else happens automatically.

Because the dispatch object and the actual MFC window object are separate in this sample, the dialog parent needs to explicitly hook the two together. This is done in the Mfcaxscrvbdlg constructor.

Named Items

Once you have dispatch objects, you have to set them up so that the script engine knows about them. The collection of all the named dispatch objects that the script engine knows about is called the "Script Namespace." Items are added to the script namespace through the IActiveScript::AddNamedItem method. As I mentioned previously, it is the host's duty to implement an IDispatch for the object and support type-information through ITypeInfo for the object. When the script engine needs to resolve a reference to a named item, it uses the IActiveScriptSite::GetItemInfo method to request an IUnknown pointer (which it queries mainly for IDispatch) and an ITypeInfo pointer.

Not everything that a host wants to be scriptable needs to be a named item. Usually the host will have a hierarchy of objects, where sub-objects are accessible through a higher-level object. A common metaphor is the Application->Document->Item hierarchy, where the Document object is accessible from the top-level Application object as an IDispatch property of the Application object itself. In the same manner, the Document object itself exposes several sub-objects and each is an Item that you can obtain through an Item array or other contrivance.

Using this scheme, the scripting engine is smart enough to navigate to a sub-item when the script code says the following without needing Document or Item to be added to the script namespace:
Set Obj = Application.Document.Item(1)
				
As long as the sub-objects are exposed as get-properties of their parent object, the script engine finds them successfully. Interestingly enough, the script engine is able to "assume" the top-level item in the hierarchy. What this means is that if Application is declared as the top-level item, then it is sufficient to say the following for the prior script code:
Set Obj = Document.Item(1)
				
This is exactly how Internet Explorer 3.0 allows you to script code in the context of the Window object without always prefixing all references to objects with "Window." A script host needs to identify the top-level script item in the call to AddNamedItems by using the SCRIPTITEM_GLOBALMEMBERS flag. What usually isn't made clear by Active Scripting documentation, however, is that only named items can support events. Using the above example, there is no syntax to say the following to handle an event in a particular item:
   Sub Application.Document.Item(1)_OnEvent ' this doesn't work!
				
So, for MfcAxscrvbdlg, because we want to be able to handle the events of every object in the hierarchy, every object is added as a Named Item. Each object is also accessible through the top-level Scripter object (the dialog itself), which does not support events currently.

WebBrowser Control:

In this sample, the script host exposes only one external object to the script namespace. This is the WebBrowser control hosted on the dialog by MFC's default control containment support. All you need is an AddRef'd dispatch pointer to the control, and you're set. For events, the external object needs to expose an ITypeInfo pointer somehow. MfcAxscrVb gets this through IProvideClassInfo::GetClassInfo. As a last resort, a host could read the object's type-information itself to expose an ITypeInfo. Fortunately, the WebBrowser control supports GetClassInfo, so MfcAxscrVb doesn't do this.

If you wanted to add other external automation objects to the namespace, all that usually is necessary is to obtain an IUnknown interface using CoCreateInstance. Alternatively, the host can support a generic means for obtaining external objects, albeit ones that don't need to have events handled. In Visual Basic, the function to do this is called CreateObject.

Getting to Other Apps: HostCreateObject

Εκτός από το σύνολο των ιδιοτήτων που χρησιμοποιούνται για να εμφανίσετε όλα τα εξαρτημένα αντικείμενα, το κύριο αντικείμενο Scripter (η κλάση παραθύρου διαλόγου ίδια) εκθέτει μόνο μια ειδική μέθοδο. Η μέθοδος αυτή παρουσιάζει ένα απλό μέσο για την προσομοίωση της VB συνάρτηση CreateObject. Σημειώστε ότι η μέθοδος ονομάζεται HostCreateObject για να τονίσετε ότι αυτή η μέθοδος δεν παρέχεται δωρεάν από το μηχανισμό δέσμης ενεργειών, αλλά ο κεντρικός υπολογιστής πρέπει να εφαρμόσετε το ίδιο. Ορισμένες στους κεντρικούς υπολογιστές με σαφήνεια δεν θέλατε να παρέχουν αυτήν τη δυνατότητα για λόγους ασφαλείας, IE3 είναι ένα κύριο παράδειγμα. Πρωταρχικός στόχος του HostCreateObject είναι να επιστρέψετε το δείκτη εκτροπής του αντικειμένου που ζητήθηκε. Από τη στιγμή που ο μηχανισμός δέσμης ενεργειών έχει ο δείκτης εκτροπής, γνωρίζει τι να κάνει από εκεί.

ΣΗΜΕΙΩΣΗ: Από την έκδοση 2.0, η VBScript και JScript τώρα μηχανισμούς CreateObject ως μια ενσωματωμένη συνάρτηση. Ο κεντρικός υπολογιστής δεν χρειάζεται να εφαρμόσετε αυτή τη λειτουργία. Αυτή η λειτουργία θα, ωστόσο, να ελέγξετε ένα αντικείμενο για να βεβαιωθείτε ότι είναι ασφαλές για εκτέλεση δέσμης ενεργειών πριν να επιτρέψετε το αντικείμενο που θα χρησιμοποιηθεί. Αντικείμενα deem ίδια ασφαλή για εκτέλεση δέσμης ενεργειών από υποστηρίζει τη διασύνδεση IObjectSafety ή σημειώνοντάς την κατάλληλη κατηγορία στοιχείων καταχωρήσεις μητρώου για την ασφαλή-για-Scripting. Αναφορά για τη Γνωσιακή Βάση της Microsoft για περισσότερες πληροφορίες.

Η κλάση οδηγού υποστήριξης

Το τελευταίο bit μικρή trickery στο MfcAxscrVb είναι το τους χειρισμούς που έγιναν για την υποστήριξη ClassWizard. Κλάση οδηγού, δεν είναι τεχνικά "dumb." Μόλις mentally challenged. Είναι αρκετά εύκολο για το τι κάνει, αλλά να θυμάστε ότι αναζητά μόνο blindly αναζητώντας αυτά τα σχόλια ClassWizard ειδικά αρχεία. Εάν ακολουθήσετε τη μορφή για COleControl, μπορείτε να σχετικά με λήψη μακριά με χρήση του ClassWizard αυτοματοποίησης και συμβάντα στηλοθέτες.

Μία complication είναι ότι η MfcAxscrVb χρησιμοποιεί παραγωγή σε ορισμένα από την ιεραρχία αντικειμένων. Όλα τα αντικείμενα κουμπί παράγονται από ένα κοινό αντικείμενο CButtonDispatch που εκθέτει ιδιότητες και μεθόδους, οι οποίες που θα μεμονωμένα υποστηρίξει. Ωστόσο, όταν βγαίνει χρόνο για να συμπληρώσετε το αρχείο .odl, κάθε μεμονωμένο αντικείμενο πρέπει να περιλαμβάνει όλες τις ιδιότητες και μεθόδους για τη γονική κλάση. Needless ότι, αυτό πρόκειται να συγχέετε Οδηγός κλάσης κατά το χρόνο για να αριθμήσετε τις DISPID. If you use Class Wizard, make sure you double-check the generated DISPIDs in two places: the .odl file for the automation class and the enumeration inside the class definition. When working with the derived button classes, it is easy to see the same DISPID assigned to multiple properties and methods. It is much easier to correct the DISPIDs, though, than to add everything by scratch, so the functionality has been left in MfcAxscrVb.

With Visual C++ 5.0's improved support of IDL methods and properties through ClassView, it's a toss up whether ClassWizard is needed or not. But MfcAxscrVb supports it for now. Enjoy.

Appendix A: Object Model

Scripter:

This is the master object from which all other objects are derived. It is "IMfcaxscrvbDlg" in the .odl file but is added as the Named Item "Scripter." It has one method, HostCreateObject, which is described above.

Button Objects:

AButton BButton, CancelButton, OKButton, RunScript

Ιδιότητες (Properties)
  • Caption: Text of button face.
MethodsPress: Acts as if the button were pushed.
  • Press: Acts as if the button were pushed.
Events
  • OnClick: Fired when button is pushed.
  • OnMouseOver: Fired when mouse rolls over button.
  • OnFocus(bSet): Fired when focus is given or taken from button.
BroCon:

BroCon is the name of the WebBrowser control on the dialog box. It supports all properties and methods as documented in the Internet Client SDK/ActiveX SDK for the WebBrowser control.

EditCon:

Methods
  • AppendLine(strToAdd): Adds strToAdd to end of edit text window.
  • InsertLine(strToAdd, nWhere): Adds strToAdd at line #nWhere.
  • RemoveLine(nWhere): Removes line # nWhere from edit window.
Events
  • OnMouseOver: Fired when mouse rolls over window.
  • OnChar(strChar): Fired when character strChar is entered into window.
  • OnFocus(bSet): Fired when focus is given or taken from button.
Lbox:

Methods
  • AddString(strIn): Adds StrIn into list box.
  • ClearList: Clears all strings from list box.
  • RemoveString(strRemove): Removes first instance of StrRemove and removes it from list box.
  • SelectString(strSelect): Selects string specified by strSelect.
Events
  • OnMouseOver: Fired when mouse rolls over window.
  • OnFocus(bSet): Fired when focus is given or taken from button.
  • OnSelCancel(strCancelled): When selection is cancelled in a list box element strCancelled.
  • OnSelChange(strChange): When a list box element strChange is selected by the user.

Ιδιότητες

Αναγν. άρθρου: 168214 - Τελευταία αναθεώρηση: Σάββατο, 18 Δεκεμβρίου 2010 - Αναθεώρηση: 2.0
Οι πληροφορίες σε αυτό το άρθρο ισχύουν για:
  • Microsoft Foundation Class Library 4.2 στις ακόλουθες πλατφόρμες
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 5.0 Professional Edition
Λέξεις-κλειδιά: 
kbdownload kbfile kbinfo kbsample kbmt KB168214 KbMtel
Μηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.
Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη:168214
Αποποίηση ευθυνών για περιεχόμενο της Γνωσιακής Βάσης (KB) που έχει αποσυρθεί
This article was written about products for which Microsoft no longer offers support. Therefore, this article is offered "as is" and will no longer be updated.

Αποστολή σχολίων

 

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