ตัวอย่าง: การโฮสต์สคริปต์ที่ใช้งานอยู่ที่ใช้ MFC MFCAxs.exe ใช้

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 168214 - ผลิตภัณฑ์ที่เกี่ยวข้องในบทความนี้
ขยายทั้งหมด | ยุบทั้งหมด

เนื้อหาบนหน้านี้

สรุป

MFCAxs.exe คือ ตัวอย่างที่ประกอบด้วย MfcAxscrVb MfcAxscrVb จะมีตัวอย่าง instructional การเขียนสคริปต์ Active โฮสต์เขียนใช้ MFC มันเป็นโฮสต์ VBScript DLL อย่างไรก็ตาม กลไกการเขียนสคริปต์ที่ใช้งานอยู่เป็นแบบทั่วไปการใด ๆ เอ็นจินการเขียนสคริปต์ที่ใช้งานอยู่ MfcAxscrVb แสดงวิธีที่เป็นไปได้เพียงหนึ่งเพื่อให้ส่งวัตถุจากโฮสต์ การใช้อินเทอร์เฟซการเขียนสคริปต์ที่ใช้งานอยู่ของโฮสต์ และ การเชื่อมต่อข้อความของหน้าต่างในโฮสต์กับเหตุการณ์ fired กับเอ็นจินการเขียนสคริปต์

MfcAxscrVb รวม 5.0 c ++ Visual โครงการและพื้นที่ทำงานแฟ้มหรือไม่ แม้ว่าไม่มีที่ 4.2 VC ++ makefile ที่เข้ากันได้หรือ mdpfile จัด รหัสแหล่งที่มาสำหรับ MfcAxscrVb ไม่เข้ากันได้กับ MFC 4.2b

ข้อกำหนดเบื้องต้น: COM ทำงานอัตโนมัติ

ข้อมูลเพิ่มเติม

แฟ้มต่อไปนี้สามารถดาวน์โหลดได้จากศูนย์ดาวน์โหลดของ Microsoft::
MFCAxs.exe
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการดาวน์โหลดแฟ้มสนับสนุนของ Microsoft โปรดคลิกหมายเลขบทความต่อไปนี้เพื่อดูบทความใน Microsoft Knowledge Base::
119591วิธีรับแฟ้มการสนับสนุนของไมโครซอฟท์จากบริการออนไลน์
Microsoft สแกนแฟ้มนี้เพื่อหาไวรัส Microsoft ใช้ซอฟต์แวร์ตรวจสอบไวรัสล่าสุด ณ วันที่มีการประกาศแฟ้มนั้นๆ แฟ้มดังกล่าวจะถูกเก็บในเซิร์ฟเวอร์เพิ่มการรักษาความปลอดภัย ซึ่งช่วยป้องกันการเปลี่ยนแปลงแก้ไขแฟ้มโดยไม่ได้รับอนุญาต

ตัวอย่างในการทำงานอยู่

เมื่อคุณเรียกใช้ตัวอย่างของ MfcAxscrVb คุณจะสังเกตเห็นตัวควบคุมการแก้ไขที่มีขนาดใหญ่อยู่มุมซ้ายด้านบนของแอพลิเคชัน คุณสามารถวาง หรือสคริปต์ประเภทเข้าไปในหน้าต่างนี้และเลือก "เรียกใช้สคริปต์" ปุ่มเพื่อเรียกใช้สคริปต์ สคริปต์ต่าง ๆ สำหรับการทดสอบจะมีให้สำหรับคุณในแฟ้ม Script.txt และ Testevents.txt

exposing โฮสต์: Dispatch ออปเจ็กต์

โฟกัสหลักสำหรับตัวอย่างนี้ถูกใช้งานของการส่งออบเจ็กต์ที่ใช้ MFC เหตุผลสำหรับการนี้เป็นแบบง่าย ภาษาสคริปต์ไม่ได้ใช้งานมากถ้าไม่เพียงสิ่งใดกับสคริปต์

เทคโนโลยีการหลักที่เมื่อซึ่งเขียนทั้งหมดใช้งานอยู่สคริปต์ขึ้นเป็นส่วนใหญ่ certainly ของระบบอัตโนมัติ ความรู้งานทึบของ Automation เป็นสิ่งจำเป็นจริง ๆ ก่อนที่จะพยายามที่จะใช้รหัสโฮสต์การเขียนสคริปต์การใช้งานอยู่ มีการอ้างอิงหลายที่ดีสำหรับการทำงานอัตโนมัติ: บท 14 และ 15 ของของ Brockshmidt "ภายใน OLE บทที่ 11 ของ Dale Rogerson "COM ภายใน" และข้อมูลอ้างอิง"ของโปรแกรมเมอร์ OLE Automation เกี่ยวกับ

CCmdTargetPlus:

สิ่งที่คุณต้องมีบางวัตถุที่อนุญาตสำหรับคุณสมบัติ scriptable และวิธีผ่าน IDispatch แต่ยัง สร้างเหตุการณ์ scriptable mfc แน่นอนทำงาน grunt ส่วนใหญ่คุณเมื่อใช้อินเทอร์เฟซการสรุปข้อมูลสำหรับวัตถุ COM อย่างไรก็ตาม คลา MFC เท่านั้นที่สนับสนุนทั้งขาเข้าอินเทอร์เฟซการส่ง และอินเทอร์เฟซการส่งออก หรือ เก็บเหตุการณ์ คือ COleControl COleControl อยู่มากเกินไป bulky สำหรับสิ่งที่คุณต้องการ คุณเพียงต้องเหตุการณ์ อินเตอร์เฟซส่ง และพิมพ์ข้อมูล VBScript ต้องสามารถอ่านชนิดข้อมูลสำหรับการส่งออบเจ็กต์ที่สนับสนุนเหตุการณ์ คุณอาจได้สร้างนี้บนลอย หรือสร้างไลบรารีชนิดแบบคงที่สำหรับออบเจ็กต์ส่งโฮสต์ของคุณ และขอรับ ITypeInfo สำหรับแต่ละวัตถุแต่ละ

ในขณะที่อาจไม่จำ MfcAxscrVb มีคลาพื้นฐานที่เรียกว่า CCmdTargetPlus ที่สนับสนุนชิ้นสามเหล่านี้: dispatch อินเทอร์เฟซ จุดเชื่อมต่อที่ มีการแมปเหตุการณ์ลักษณะของตัวควบคุม และข้อมูลชนิดที่สามารถเข้าถึงได้อย่างง่ายดายผ่าน IProvideClassInfo มีเพิ่มรหัสใน CmdTargetPlus ส่วนใหญ่การอนุญาตสำหรับการแมปเหตุการณ์ การทำให้ที่เพิ่มเหตุการณ์ไปยังคลาสที่ได้ง่ายขึ้นมากที่ได้รับ

วัตถุที่ส่ง:

ใช้ CCmdTargetPlus วัตถุทั้งหมดที่โฮสต์โดยสรุปข้อมูลจะนำมาใช้ มีบางสิ่งที่จำเป็นต่อการทำงานด้วย อ้างอิงถึงออบเจ็กต์ที่ส่ง (CAButtonDispatch, CBButtonDispatch และ forth อื่น ๆ) ใดสำหรับการ boilerplate บนสิ่งจำเป็นต้อง rundown ที่ย่อในรูปแบบของวัตถุของ MfcAxscrvb แสดงอยู่ในตอนท้ายของเอกสารนี้

ถ้าคุณเพิ่มวัตถุของคุณเอง ให้แน่ใจว่าได้ double-check สำหรับ guid สามเฉพาะของ สำหรับหลักส่งและอินเทอร์เฟซหลักของเหตุการณ์ และ clsid สำหรับวัตถุในผลรวม ซึ่งจำเป็นต้องทำ ในแฟ้มใช้งาน และแฟ้ม.odl (ตัด และวางช่วยต่อไปนี้) ตัด และวางทั้งหมดของแมโครการตัวช่วยสร้างคลา และเปลี่ยนแปลงเหล่านั้นลงในคลาชื่อใหม่ ตัวช่วยสร้างการคลาสที่มีเฉพาะมาก แต่ทุกอย่างที่เพิ่งขวาใน.odl, .h และ.cpp แฟ้ม คุณสามารถใช้เพื่อเพิ่มเหตุการณ์ใหม่ คุณสมบัติ และใช้ในการวิธีการส่งของวัตถุกับว่างานได้กับ MFC OLE Control ถ้าคุณทำตาม นี่คือ handy sort หนึ่ง

MfcAxscrVb เก็บวัตถุการนำมาบังคับใช้กลไกการสรุปข้อมูลแยกต่างหากจาก MFC วัตถุ ซึ่งจริง ๆ แล้วเป็นการอ้างอิงถึง ตัวอย่างเช่น กล่องโต้ตอบมีปุ่มที่เรียกว่าการ "AButton ซึ่งเป็น scriptable วัตถุที่ใช้ MFC ปุ่มคือ CButton ได้มา CCmdTargetPlus คลา CAButtonDispatch ถูกแยกต่างหาก และแตกต่างกัน นี่คือจุดสำคัญนั้น เฉพาะ สิ่งโปรแกรมเมอร์โฮสต์ได้เลือกการแสดงสำหรับวัตถุ MFC พื้นฐานและการควบคุมของ Windows จะ scriptable

CeventsListBox CEventsButton, CEventsEdit :

สำหรับเหตุการณ์ มีต้องเป็นบางรหัสที่ตอบสนองต่อไปยัง Windows เหตุการณ์--เรียก คลิกปุ่ม-- และสร้างเหตุการณ์สำหรับโปรแกรมสคริปต์ (จำเหตุการณ์ถูกส่ง Invoke บนอินเทอร์เฟซจัดการ โดยจุดการเชื่อมต่อในวัตถุโฮสต์) 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 หลัก (กล่องโต้ตอบคลาเอง) exposes วิธีพิเศษเดียวเท่านั้น วิธีนี้อธิบายหมายถึงการ simple คำสำหรับการจำลองการฟังก์ชัน CreateObject ของ VB โปรดสังเกตว่า วิธีการตั้งชื่อ HostCreateObject ไป emphasize ว่า วิธีนี้ไม่มีฟรี โดยโปรแกรมสคริปต์ แต่โฮสต์ต้องปฏิบัติตามตัวเอง โฮสต์บางอย่างชัดเจนจะไม่ต้องการให้ความสามารถในการทำงานนี้สำหรับเหตุผลด้านความปลอดภัย IE3 คือ ตัวอย่างที่ prime จุดประสงค์หลักของ HostCreateObject คือเพื่อ ส่งตัวชี้ของวัตถุที่ร้องขอการย้อนกลับ หลังจากเอ็นจินการเขียนสคริปต์ได้ชี้ส่ง นั้นทราบสิ่งที่ต้องทำจากที่นั่น

หมายเหตุ:: เป็นรุ่น 2.0 เอ็นจิน VBScript และ JScript เดี๋ยวนี้สนับสนุน CreateObject เป็นฟังก์ชันภายใน โฮสต์ไม่จำเป็นต้องใช้ฟังก์ชันนี้ ฟังก์ชันนี้จะ ทดสอบวัตถุเพื่อตรวจสอบให้แน่ใจว่า มีความปลอดภัยสำหรับสร้างสคริปต์ก่อนที่จะอนุญาตให้วัตถุที่จะใช้อย่างไรก็ตาม วัตถุ deem ให้พวกเขาเองปลอดภัยสำหรับการเขียนสคริปต์ด้วยการสนับสนุนอินเทอร์เฟซ IObjectSafety หรือการทำเครื่องหมายรายการรีจิสทรีประเภทของคอมโพเนนต์ที่เหมาะสมสำหรับการเขียนเซฟสำหรับสคริปต์ ให้อ้างอิงไปยัง Microsoft Knowledge Base สำหรับข้อมูลเพิ่มเติม

คลาสของตัวช่วยสร้างการสนับสนุน

บิตเพียงเล็กน้อยสุดท้ายของ trickery ใน MfcAxscrVb คือ manipulations ที่ทำให้การสนับสนุน ClassWizard ตัวช่วยสร้างคลาส ไม่ technically "dumb" จะมีเพียง mentally challenged มีความสะดวก pretty สำหรับสิ่งใด แต่จำไว้ว่า จะเพียงแค่ blindly ค้นแฟ้มที่ค้นหาข้อคิดเห็น ClassWizard พิเศษเหล่านั้น ถ้าคุณทำตามรูปแบบสำหรับ COleControl คุณสามารถเพียงแค่เกี่ยวกับรับเก็บด้วยการใช้การทำงานอัตโนมัติและเหตุการณ์ของ ClassWizard แท็บ

complication หนึ่งคือ ว่า MfcAxscrVb ใช้ derivation ในลำดับชั้นของวัตถุบางอย่าง วัตถุปุ่มทั้งหมดได้รับมาจากวัตถุ CButtonDispatch ทั่วไปที่ exposes คุณสมบัติและเมธ ทั้งหมดที่มันจะทีละสนับสนุน อย่างไรก็ตาม เมื่อคุณเวลาในการกรอกข้อมูลแฟ้ม.odl แต่ละวัตถุแต่ละต้องประกอบด้วยคุณสมบัติทั้งหมดและวิธีการเป็นคลาสหลัก needless การเปรียบ นี้มีกำลัง confuse ตัวช่วยสร้างคลาเมื่อมันมาเวลา DISPIDs จะใช้หมายเลข ถ้าคุณใช้ตัวช่วยสร้างคลา ตรวจสอบคุณ double-check DISPIDs ที่สร้างขึ้นในสถานที่สอง: แฟ้ม.odl สำหรับคลาดำเนินการอัตโนมัติและการแจงนับอยู่ภายในคำจำกัดความคลา เมื่อทำงานกับคลาสที่ได้รับปุ่ม จะง่ายต่อการดู DISPID เดียวกันที่กำหนดให้กับคุณสมบัติและวิธีการต่าง ๆ เป็นการง่ายมากขึ้นแก้ไข DISPIDs น่า ไม่ใช่เพื่อเพิ่มทุกอย่างด้วยการลบ ดังนั้นการทำงานได้ถูกปล่อยใน MfcAxscrVb

โดยของ c ++ Visual 5.0 ปรับปรุงสนับสนุน IDL วิธีและคุณสมบัติผ่าน ClassView ได้มี toss อัพว่าจำ ClassWizard หรือไม่ แต่ MfcAxscrVb สนับสนุนดังกล่าวในขณะนี้ เพลิดเพลินกับรายการ

appendix a:รูปแบบของวัตถุ

scripter:

นี่คือวัตถุหลักซึ่งวัตถุอื่น ๆ ทั้งหมดได้รับมา 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

คุณสมบัติ
  • 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.

คุณสมบัติ

หมายเลขบทความ (Article ID): 168214 - รีวิวครั้งสุดท้าย: 7 มกราคม 2554 - Revision: 2.0
ใช้กับ
  • Microsoft Foundation Class Library 4.2 เมื่อใช้กับ:
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 5.0 Professional Edition
Keywords: 
kbdownload kbfile kbinfo kbsample kbmt KB168214 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:168214
การปฏิเสธความรับผิดชอบในเนื้อหาของ KB ที่จะไม่มีการปรับปรุงอีกต่อไป
บทความนี้กล่าวถึงผลิตภัณฑ์ที่ Microsoft ไม่มีการสนับสนุนอีกต่อไป เนื้อหาของบทความจึงมีการนำเสนอ "ตามลักษณะที่เป็น" และจะไม่มีการปรับปรุงข้อมูลอีก

ให้ข้อเสนอแนะ

 

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