Voorbeeld: MFCAxs.exe implementeert een actieve scripthost met MFC

BELANGRIJK: Dit artikel is vertaald door de vertaalmachine software van Microsoft in plaats van door een professionele vertaler. Microsoft biedt u professioneel vertaalde artikelen en artikelen vertaald door de vertaalmachine, zodat u toegang heeft tot al onze knowledge base artikelen in uw eigen taal. Artikelen vertaald door de vertaalmachine zijn niet altijd perfect vertaald. Deze artikelen kunnen fouten bevatten in de vocabulaire, zinsopbouw en grammatica en kunnen lijken op hoe een anderstalige de taal spreekt en schrijft. Microsoft is niet verantwoordelijk voor onnauwkeurigheden, fouten en schade ontstaan door een incorrecte vertaling van de content of het gebruik ervan door onze klanten. Microsoft past continue de kwaliteit van de vertaalmachine software aan door deze te updaten.

De Engelstalige versie van dit artikel is de volgende:168214
Vrijwaring inhoud KB-artikelen over niet langer ondersteunde producten
Dit artikel heeft betrekking op producten waarvoor Microsoft geen ondersteuning meer biedt. Daarom wordt dit artikel alleen in de huidige vorm aangeboden en wordt het niet meer bijgewerkt.
Samenvatting
MFCAxs.exe is een voorbeeld van MfcAxscrVb. MfcAxscrVb is eenVoorbeeld instructie Active Script ing host geschreven met gebruikmaking van MFC. Deze host is van deVBScript DLL; de mechanismen actief uitvoeren van scripts zijn echter een algemeneActieve script ing engine. MfcAxscrVb bevat slechts één mogelijke manier te biedenverzending objecten van de host, de host actieve scripts implementereninterfaces, en de berichten van windows in de host verbinding maken met gebeurtenissengestart om de script-engine.

MfcAxscrVb bevat een Visual C++ 5. 0-werkruimte en project bestand. Hoewelgeen compatibele Make VC + + 4. 2 of mdpfile wordt geleverd, de broncode voorMfcAxscrVb is compatibel met MFC-4.2b.

Voorwaarden: COM-automatisering
Meer informatie
Het volgende bestand wordt gedownload vanaf het Microsoft Download Center:
Voor meer informatie over het downloaden van Microsoft-ondersteuningsbestanden, klikt u op het volgende artikelnummer in de Microsoft Knowledge Base:
119591Hoe Microsoft-ondersteuningsbestanden via Online Services downloaden
Microsoft heeft dit bestand op virussen. Microsoft gebruikt de meest actuele software voor virusdetectie die beschikbaar was op de datum waarop het bestand werd gepost. Het bestand is opgeslagen op beveiligde servers die onbevoegde wijzigingen aan het bestand verhinderen.

Het monster wordt uitgevoerd

Bij het uitvoeren van de MfcAxscrVb-voorbeeld ziet u een groot besturingselement inde linkerbovenhoek van de toepassing. U kunt plak of typ scriptin dit venster en selecteer de "Script uitvoeren" om het script aanroepen.Meerdere test scripts beschikbaar voor u in de Script.txt enTestevents.txt bestanden.

De Host bloot: objecten verzenden

De belangrijkste focus voor dit voorbeeld is de implementatie van verzending objectenmet gebruikmaking van MFC. De reden hiervoor is eenvoudig. Een script taal niet veelAls er niets voor script gebruik.

De kern technologie waarvan alle actieve scripts afhankelijk is van de meestezeker die van automatisering. Een solide kennis van automatisering isabsoluut noodzakelijk is voordat u de code van een willekeurige host actief uitvoeren van scripts.Er zijn verschillende goede naslag informatie voor automatisering: hoofd stukken 14 en 15De Brockshmidt 'in OLE,"hoofd stuk 11 van van Dale Rogerson 'in COM' ende "OLE-automatisering Programmer's Reference'.

CCmdTargetPlus:

Wat u nodig hebt zijn sommige objecten waarmee aanpasbare eigenschappen enmethoden via IDispatch maar ook scripts voorbereide gebeurtenissen genereren. MFCzeker werkt de meeste van de knorvis u bij het implementeren van verzendinginterfaces voor een COM-object. Echter, het enige MFC-klasse die zowel ondersteuntbinnenkomende verzending interfaces en interfaces voor uitgaande verzending of gebeurtenisPut, COleControl. COleControl is veel bezichtiging voor wat u wilt. Ualleen gebeurtenissen, een interface voor verzending en informatie typt. VBScriptmoet lezen informatie over verzending objecten die gebeurtenissen ondersteunen.U kan maken dit een dynamische of statische typebibliotheek makenverzending van objecten voor de host en de ITypeInfo verkrijgen voor elkafzonderlijke object.

Hoewel waarschijnlijk niet nodig, heeft MfcAxscrVb een basis klasse met de naamCCmdTargetPlus die deze drie stuks ondersteunt: verzending interfaceverbindings punten met een overzicht van de gebeurtenis standaards tijl en gemakkelijk toegankelijkTyp de informatie via IProvideClassInfo. De meeste code inCmdTargetPlus is toegevoegd zodat de gebeurtenis kaarten, waardoor gebeurtenissen toevoegenaan afgeleide klassen veel gemakkelijker.

Verzending-objecten:

Alle geleverde host verzending objecten worden geïmplementeerd met behulp van CCmdTargetPlus.Er zijn een paar dingen die ze nodig hebben om goed te kunnen laten doen. Verwijzen naar een van deverzending van objecten (CAButtonDispatch, CBButtonDispatch, enzovoort) voor eenstandaard op wat nodig is. Een kort overzicht van het MfcAxscrvb-objectmodel wordt weer gegeven aan het einde van dit document.

Als u uw eigen objecten toevoegen, moet u controleren of voor drie unieke GUID'svoor de primaire verzending en primaire gebeurtenissen interfaces en de clsidvoor het object in totaal. Dit moet worden gedaan in het implementatie bestand enin het bestand .odl. (Knippen en plakken helpt hier.) Knip en plak alle van dewizard macro's klasse en vervolgens wijzigen in de naam van de nieuwe klasse. KlasseDe wizard is bij zonder, maar als u alles gewoon rechts de.odl. h en. cpp bestanden, kunt u het toevoegen van nieuwe gebeurtenissen, eigenschappen, enmethoden om uw verzending object alsof het een MFC OLE-besturingselement. Dit issorteren van handige.

MfcAxscrVb blijft de uitvoering van de afzonderlijke verzending mechanismen objectuit de MFC-object, dat zij daadwerkelijk naar verwijst. Bijvoorbeeld, dedialoog venster bevat een knop met de naam van de "AButton," scriptable is. Het MFCknop object is CButton. De klasse die is afgeleid van CCmdTargetPlus,CAButtonDispatch, is onafhankelijk en verschillend zijn. Dit is een belangrijk punt. Alleen watde host-programmeur expliciet wil bloots tellen voor basis MFC objecten enWindows-besturingselementen worden scripts.

CEventsButton, CEventsEdit, CeventsListBox:

Gebeurtenissen moet er bepaalde code die op een Windows-gebeurtenis reageert:Klik op een knop - en wordt een gebeurtenis gegenereerd voor de script-engine.(Vergeet niet dat een gebeurtenis is een verzending aanroepen op een interface afgehandeld doorverbindings punten in het hostobject.) In dit voorbeeld gebeurt doorstandaard MFC bericht handlers toevoegen aan objecten die zijn afgeleid van de verschillendeklassen. Elk van deze handlers is slechts aan te roepen (door van FireEventde code toegevoegd aan CCmdTargetPlus) op het object verzending. Alles andersautomatisch gebeurt.

Omdat het object verzending en de werkelijke MFC vensterobject afzonderlijkin dit voorbeeld wordt moet het bovenliggende dialoog venster expliciet de twee hooksamen. Dit wordt gedaan in de constructor van Mfcaxscrvbdlg.

Benoemde Items

Als u objecten verzending hebt, hebt u deze instellen zodat het scriptmotor weet over hen. De collectie van alle benoemde verzending-objectendat de script eng ine is op de hoogte wordt genoemd de "Script naam ruimte'. Artikelenworden toegevoegd aan de script naam ruimte door de IActiveScript::AddNamedItemmethode. Zoals ik eerder vermeld, is het recht van de host voor de uitvoering van eenVoor het object en ondersteuning van type-informatie via ITypeInfo-voor IDispatchhet object. Als de script-engine moet een verwijzing naar een benoemd omzettenitem, wordt de methode IActiveScriptSite::GetItemInfo om te vragen eenIUnknown pointer (die query's over IDispatch voornamelijk) en een ITypeInfo-aanwijzer.

Niet alles dat een host wil scriptable moet een benoemd item.De host heeft doorgaans een hiërarchie van objecten, waarbij subobjecten zijntoegankelijk via een object op een hoger niveau. Een algemene metafoor is deToepassing-> Document-> de object hiërarchie, waar het Document-object istoegankelijk vanuit het Application-object op het hoogste niveau als een IDispatch-eigenschapvan het Application-object zelf. Op dezelfde wijze, het Document-objectzelf beschrijft verschillende subobjecten en elk is een artikel dat u kunt verkrijgenvia een object matrix of andere misleiding.

Met deze regeling, de script-engine is slim genoeg om te navigeren naar eenAls de scriptcode de volgende zegt zonder Document subpostof het Item moet worden toegevoegd aan de script naam ruimte:
Set Obj = Application.Document.Item(1)				
Zolang de subobjecten worden blootgesteld als get-eigenschappen van het bovenliggendeobject, de script eng ine zoekt ze succes. Grappige genoeg,de script eng ine kan "nemen" het item op het hoogste niveau in de hiërarchie.Wat dit betekent is dat als de toepassing wordt gedeclareerd als het item op het hoogste niveauvervolgens volstaat het de volgende gegevens voor het voorgaande scriptcode zegt:
Set Obj = Document.Item(1)				
Dit is precies hoe Internet Explorer 3. 0 kunt u scriptcode in decontext van het Window-object zonder voorvoegsel altijd alle verwijzingen naarobjecten met "Venster". Scripthost moet identificeert het script op het hoogste niveauitem in de aanroep van AddNamedItems met behulp van de SCRIPTITEM_GLOBALMEMBERSvlag. Wat meestal wissen door Active Script ing documentatie is niet gemaaktechter, is dat alleen benoemde items gebeurtenissen kunnen ondersteunen. Met behulp van de bovenstaandein het volgende voorbeeld, er is geen syntaxis te zeggen de volgende voor het verwerken van een gebeurtenis in eenbepaald item:
   Sub Application.Document.Item(1)_OnEvent ' this doesn't work!				
Ja, voor MfcAxscrvbdlg, aangezien we voor het afhandelen van gebeurtenissenelk object in de hiërarchie, elk object wordt toegevoegd als een benoemd Item. Elkeobject is ook toegankelijk via het bovenste object schrijft (het dialoog vensterzelf), die geen gebeurtenissen momenteel.

Besturings element WebBrowser:

In dit voorbeeld wordt de scripthost slechts één externe object beschrijft deScript naam ruimte. Dit is het besturings element WebBrowser ondergebracht in het dialoog venster doorMFC van standaard besturings element beheersings ondersteuning. Alles wat u nodig hebt is een AddRef hadverzending-aanwijzer op het besturings element, en u bent ingesteld. Gebeurtenissen op het externeobject moet een ITypeInfo-pointer geraakt. MfcAxscrVb haalt ditvia IProvideClassInfo::GetClassInfo. Als laatste redmiddel kan een hosthet object type-informatie zelf weer een ITypeInfo lezen.Gelukkig GetClassInfo, zo MfcAxscrVb biedt ondersteuning voor het besturings element WebBrowserdit doen niet.

Als u andere externe automatiseringsobjecten toevoegen aan de naam ruimtealle die gewoonlijk nodig is voor een IUnknown interface die isCoCreateInstance. De host kan ook een generieke middelen voor ondersteuningexterne objecten verkrijgen, ook al zijn die niet te hoeven hebben van gebeurtenissenverwerkt. In Visual Basic, wordt hiervoor de functie CreateObject genoemd.

Bij andere Apps: HostCreateObject

Andere dan de set eigenschappen die worden gebruikt om alle onderliggende objecten toegankelijk te makende belangrijkste schrijvers van object (het dialoog venster klasse zelf) beschrijft slechts één specialemethode. Deze methode illustreert dat een eenvoudige betekent voor het simuleren van VBDe functie CreateObject. Houd er rekening mee dat de methode HostCreateObject om de naamBenadruk dat deze methode niet gratis door de scriptengine verstrekt isde host moet worden geïmplementeerd, maar zelf. Sommigen duidelijk wilt nietDeze mogelijkheid bieden om veiligheids redenen, IE3 is een goed voorbeeld. Hetvoornaamste doel van HostCreateObject is dat de aanwijzer van de verzending van dehet gevraagde object. Als de script-engine de aanwijzer verzending heeft hetweet wat te doen vanaf daar.

OPMERKING: Van versie 2. 0 ondersteunen de engines van VBScript en JScript nuAls een ingebouwde functie CreateObject. De host hoeft niet te implementerenDeze functie. Deze functie zal echter een object om te controleren of het testenis het veilig voor script gebruik voordat het object moet worden gebruikt. Objecten achtenzelf veilig voor script gebruik door ofwel de IObjectSafety-ondersteuninginterface of de juiste Component categorie registervermeldingen markerenvoor veilige-voor-scripts. Verwijzen naar de Microsoft Knowledge Base voor meer informatieinformatie.

Class Wizard ondersteuning

Het laatste beetje bedrog in MfcAxscrVb is de manipulaties aangebrachtondersteuning voor ClassWizard. Wizard klasse, is technisch gezien niet "dumb". Is het nietgeestelijk betwist. Het is heel handig voor wat het doet, maar vergeet nietdat deze alleen 'blind zoekt naar bestanden zoekt die speciale ClassWizardopmerkingen. Als u de indeling voor COleControl volgt, kunt u vrijwel krijgenweg tabs met behulp van automatisering en gebeurtenissen van ClassWizard klikt.

Een complicatie is dat MfcAxscrVb afleiding in sommige van haar object gebruikthiërarchie. Alle knop objecten zijn afgeleid van een gemeenschappelijkeCButtonDispatch-object bevat de eigenschappen en methoden, waarin alleafzonderlijk zou ondersteunen. Echter, wanneer het tijd om in te vullen gaat het.odl bestand, moet van elk afzonderlijk object bevat alle eigenschappenen methoden van de bovenliggende klasse. Gaat dit betoog wil zeggen verwardWizard klasse wanneer er naar het DISPID's nummer. Als u een klasseWizard, moet u controleren of de gegenereerde DISPID's in twee locaties: debestand voor de klasse automatisering en de opsomming binnen de klasse .odldefinitie. Wanneer u met de knop afgeleide klassen werkt, is het gemakkelijk om te ziendezelfde DISPID toegewezen aan verschillende eigenschappen en methoden. Het is veelgemakkelijker te corrigeren van de DISPID's, maar dan wilt toevoegen alles zelf,de functionaliteit is dus nog in MfcAxscrVb.

Met de verbeterde ondersteuning van IDL methoden en eigenschappen van Visual C++ 5. 0via ClassView is een wegs omhoog of ClassWizard nodig is of niet. MaarMfcAxscrVb ondersteunt nu. Geniet van.

Bijlage a: objectmodel van

Schrijft:

Dit is het hoofd object waaruit alle andere objecten worden afgeleid. Het is"IMfcaxscrvbDlg" in het bestand .odl, maar als het benoemde Item is toegevoegd"Leerstof." Er is één methode, HostCreateObject, die hierboven is beschreven.

Knop objecten:

AButton BButton, CancelButton, OKButton, RunScript

Eigenschappen
  • Bijschrift: Tekst van het knopvlak.
MethodenPers: Fungeert als de knop heeft gedrukt.
  • Pers: Fungeert als de knop heeft gedrukt.
Gebeurtenissen
  • OnClick: Die optreedt wanneer de knop wordt gedrukt.
  • OnMouseOver: Die optreedt wanneer de muis aanwijzer over de knop.
  • OnFocus(bSet): Die optreedt wanneer de focus krijgt of knop onttrokken.
BroCon:

BroCon is de naam van het besturings element WebBrowser in het dialoog venster. Ondersteuntalle eigenschappen en methoden zoals beschreven in de Internet Client SDK/ActiveXDe SDK voor het besturings element WebBrowser.

EditCon:

Methoden
  • AppendLine(strToAdd): Toegevoegd strToAdd tot het einde van het tekst venster bewerken.
  • InsertLine (strToAdd, /n/nwaarbij): strToAdd toegevoegd aan de regel #nWhere.
  • RemoveLine(nWhere): Lijn # nWhere uit bewerken venster verwijderd.
Gebeurtenissen
  • OnMouseOver: Die optreedt wanneer de muis aanwijzer over het venster.
  • OnChar(strChar): Die optreedt als strChar teken is ingevoerd in het venster.
  • OnFocus(bSet): Die optreedt wanneer de focus krijgt of knop onttrokken.
Lbox:

Methoden
  • AddString(strIn): StrIn toegevoegd in de keuze lijst.
  • ClearList: Hiermee wist u alle teken reeksen in keuze lijst.
  • RemoveString(strRemove): Eerste exemplaar van StrRemove worden verwijderd en verwijderd uit de keuze lijst.
  • SelectString(strSelect): Hiermee selecteert u teken reeks van strSelect.
Gebeurtenissen
  • OnMouseOver: Die optreedt wanneer de muis aanwijzer over het venster.
  • OnFocus(bSet): Die optreedt wanneer de focus krijgt of knop onttrokken.
  • OnSelCancel(strCancelled): Wanneer selectie geannuleerd in een keuze lijstelement strCancelled.
  • OnSelChange(strChange): Wanneer een lijst in element strChange is geselecteerd door de gebruiker.

Waarschuwing: dit artikel is automatisch vertaald

Eigenschappen

Artikel-id: 168214 - Laatst bijgewerkt: 02/23/2011 09:57:00 - Revisie: 2.0

Microsoft Foundation Class Library 4.2

  • kbdownload kbfile kbinfo kbsample kbmt KB168214 KbMtnl
Feedback