範例: MFCAxs.exe 實作使用 MFC 的使用中的指令碼主機

文章翻譯 文章翻譯
文章編號: 168214 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

結論

MFCAxs.exe 是包含 MfcAxscrVb 的範例。MfcAxscrVb 是為指示性範例動態指令碼主機使用 MFC 撰寫。裝載 VBScript DLL ; 但是,動態指令碼處理機制泛型任何動態指令碼引擎。MfcAxscrVb 是只是其中一種分派物件會提供從主機實作主應用程式的動態指令碼介面,並對指令碼引擎引發的事件與連接的主應用程式中的視窗訊息的可能方式。

MfcAxscrVb 包含 Visual C++ 5.0 的工作區和專案檔。雖然提供沒有 VC + + 4.2 相容 Makefile 或 mdpfile MfcAxscrVb 原始程式碼是 MFC 4.2b 與相容。

必要條件: COM 自動化

其他相關資訊

下列檔案是可以從 Microsoft 下載中心 」 下載:
MFCAxs.exe
如需有關如何下載 Microsoft 支援檔案的詳細資訊,按一下 [下列面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
119591如何從線上服務取得 Microsoft 支援檔案
Microsoft 已掃描這個檔案有無病毒。Microsoft 使用已張貼檔案的日期中的 [可用的最新病毒偵測軟體。檔案儲存在安全性強化的伺服器上,以避免任何未經授權的更改至檔案。

執行範例

當執行 MfcAxscrVb 範例時,您會注意到左上角的應用程式中的大型的編輯控制項。您可以貼上或型別到這個視窗的指令碼,並選取 「"指令執行碼 」 按鈕來叫用指令碼。 數個測試指令碼為您提供 Script.txt 和 Testevents.txt 檔案中。

公開主機: 分派物件

在這個範例的主要重點是使用 MFC 的分派物件的實作。原因是簡單的。如果沒有任何項目到指令碼,指令碼語言並不多大用處。

其中所有的動態指令碼依存的核心技術是大部分肯定,自動化。實心的工作知識,自動化的嘗試任何動態指令碼處理主應用程式的程式碼之前是絕對必要的。 有數個很好的參考進行自動化: 章節 14 與 15 的 Brockshmidt 的 「 內部 OLE,"章節 11 Dale Rogerson"內部 COM,"和"OLE 自動化程式設計人員參考 >。

CCmdTargetPlus:

您需要什麼是允許可編寫指令碼的屬性和方法透過 IDispatch,但也會產生可編寫指令碼事件的某些物件。MFC 一定會大部份的 grunt 工作為您實作 COM 物件的分派介面時。但是,只支援傳入的分派介面和外寄的分派介面或事件接收器的 MFC 類別是 COleControl。COleControl 是您想得太體積。您只想要分派介面的事件,並鍵入資訊。VBScript 需要閱讀支援事件的分派物件的型別資訊。 您可能在即時上建立這或建立靜態型別程式庫之主機的分派物件並取得 ITypeInfo 為每個個別的物件。

雖然可能不必要 MfcAxscrVb 有基底類別稱為支援這三項 CCmdTargetPlus: 分派介面、 以控制項樣式事件對應和透過 IProvideClassInfo 易於存取的型別資訊的連接點。大部分的程式碼中 CmdTargetPlus 已新增至允許事件對應新增事件到哪一個會讓衍生類別更容易。

分派物件:

提供主應用程式分派的所有物件 CCmdTargetPlus 都實作。 有幾件事,他們需要執行的工作良好。請參閱任何分派物件 (CAButtonDispatch、 CBButtonDispatch,等等),以取得上什麼是必要的重複使用。MfcAxscrvb 的物件模型上的簡短摘要列於此文件的結尾。

如果您將您自己的物件加入務必為三個唯一的 GUID 為主要分派以及主要事件介面和物件中加總 clsid 再次確認。這需要在實作檔和.odl 檔案中完成。(剪下和貼上這裡協助)。剪下和貼上所有類別精靈巨集,然後將它們變更為新的類別名稱。類別精靈 」 非常特定,但如果您遵循一切只是右.odl、.h,和.cpp 檔案、 使用它來加入新的事件,屬性,如同其原本的 MFC OLE 控制您分派的方法的物件。這是有點很方便。

MfcAxscrVb 保留物件實作從 MFC 物件的實際參照到個別的分派機制。比方說 [] 對話方塊中有一個按鈕叫做"AButton,"這是可編寫指令碼。MFC 按鈕物件是 CButton。[CCmdTargetPlus 衍生的類別,CAButtonDispatch,是個別且不同。這是關鍵點。只有什麼主機程式設計人員明確選擇要公開 (Expose) 為基本的 MFC 物件和 Windows 控制項將會可編寫指令碼。

CEventsButton CEventsEdit,CeventsListBox:

事件,需要有一些程式碼,會回應一個 Windows 事件--比如說,按一下按鈕--並產生指令碼引擎的事件。 (請記住事件是分派由主應用程式物件的連接點介面上叫用)。這個範例完成這藉由新增標準 MFC 訊息處理常式成衍生自各種類別的物件。每個這些處理常式只是有在分派物件上呼叫 FireEvent (承蒙的程式碼加入至 CCmdTargetPlus)。其餘的項目會自動發生。

因為這個範例中的個別分派物件和實際的 MFC 視窗物件,對話方塊父需要明確地連接這兩個一起。這是 Mfcaxscrvbdlg 建構函式中。

具名的項目

一旦分派物件您必須設定它們,讓指令碼引擎知道有關它們。指令碼引擎所知的所有具名的分派物件的集合稱為命名 」 指令碼空間"。項目會透過 IActiveScript::AddNamedItem 方法加入至指令碼命名空間。如我先前所述,是實作物件 IDispatch,並支援透過 ITypeInfo 的型別資訊物件的主應用程式的職責。當指令碼引擎需要命名的項目將參考解析時,它使用 IActiveScriptSite::GetItemInfo 方法來要求一個 IUnknown 指標 (它會查詢主要用於 IDispatch) 和 ITypeInfo 指標。

不一切主應用程式想要成為可編寫指令碼必須是命名的項目。 通常是主應用程式會有其中 sub-objects 是透過較高層級物件可存取的物件的階層架構。常見隱喻是應用程式文件->-> [項目階層其中文件物件是從最上層的 [應用程式] 物件存取為 IDispatch 屬性的應用程式物件本身。在相同的方式文件物件本身會公開幾個 sub-objects,每一個都可以透過陣列項目或其他 contrivance 取得的項目]。

使用這個配置,指令碼引擎是足夠的智慧時,不需要文件指令碼寫著 [下列瀏覽到一個 sub-item 或項目加入至指令碼命名空間:
Set Obj = Application.Document.Item(1)
				
如只要 sub-objects 會公開為 get 屬性其父物件的指令碼引擎找到這些成功。有趣的是夠,指令碼引擎是能夠假設在階層架構中的最上層項目。 這表示如果應用程式宣告為最上層的項目,然後就是要說下列先前發行的指令碼的足夠:
Set Obj = Document.Item(1)
				
這剛好是可如何網際網路總管 3.0 讓您將 Window 物件的內容中的指令碼而不一定前置所有參考物件具有 「 視窗]。指令碼主機需要以識別最上層的指令碼項目對 AddNamedItems 呼叫中使用 SCRIPTITEM_GLOBALMEMBERS 旗標。什麼通常不但是清除所動態指令碼文件做,是只名為 [項目可以支援事件。使用上述範例,沒有說下列方式來處理事件特定的項目中沒有語法:
   Sub Application.Document.Item(1)_OnEvent ' this doesn't work!
				
得,為 MfcAxscrvbdlg,因為我們想要能夠處理在階層架構中的每個物件事件的每個物件會新增為具名的項目。每個物件也是可以透過最上層 Scripter 物件 ([] 對話方塊本身),它目前不支援事件存取。

WebBrowser 控制項:

這個範例中指令檔主機會顯露至指令碼的命名空間只有一個外部物件。這是由 MFC 的預設控制項內含項目支援裝載於對話方塊上 [WebBrowser 控制項。您只需要一個 AddRef 想分派指標在控制項,且您設定。事件,外部物件需要以某種方式公開 ITypeInfo 指標。MfcAxscrVb 取得這透過 IProvideClassInfo::GetClassInfo。最後的方法是: 主機可以讀取物件的型別-資訊本身的 ITypeInfo 公開 (Expose)。 幸運的是,WebBrowser 控制項支援 GetClassInfo,因此 MfcAxscrVb 並不會執行此操作。

若要將其他外部的自動化物件加入至命名空間通常是在所需的所有是取得使用 CoCreateInstance IUnknown 介面。或者,主應用程式可以支援泛型方法以取得外部物件雖然不需要的一種具有事件處理。在 Visual Basic 中要執行這項操作函式會呼叫 CreateObject。

取得其他應用程式: HostCreateObject

用來公開 (Expose) 的所有子物件的屬性集,以外的其他主要 Scripter 物件 (在對話方塊類別本身) 會公開只有一個特殊的方法。這個方法將示範簡單的表示來模擬 VB 的 CreateObject 函式。請注意,方法命名 HostCreateObject 強調由指令碼] 引擎不提供這個方法是免費的但主應用程式必須實作它本身。有些主機清楚地不想要提供這個能力基於安全性理由,IE3 是首要的範例。HostCreateObject 的主要目標是物件的要傳回分派指標的要求。一旦指令碼引擎已分派指標,它知道要從該處做什麼。

注意: 以 2.0 版的 VBScript 和 JScript 引擎現在支援 CreateObject 為內建函式。主應用程式並不需要實作這個函式。這個函式將但是,測試物件以確定它是安全用於指令碼允許要使用物件之前。物件視為本身以編寫指令碼由支援 IObjectSafety 介面或指令碼安全-對-處理適當的元件類別登錄項目在標記的安全。參照到如需 「 Microsoft 知識庫。

類別精靈支援

最後一個一些 MfcAxscrVb 是騙術的支援 ClassWizard 所做的操作。類別精靈、 技術上不是 「 無聲]。它只是心理被挑戰。它是很方便的什麼它,但請記住它只盲目地搜尋尋找這些特殊 ClassWizard 註解的檔案。如果您遵循格式為 COleControl,您可以 get 離開,與使用 ClassWizard 的自動化和事件的相關標籤。

一個複雜的因素在於 MfcAxscrVb 會使用一些其物件階層架構中衍生。所有的按鈕物件會從常見的 CButtonDispatch 物件公開屬性和所有這些它會個別地支援的方法衍生。不過時的時間來填寫.odl 檔案,, 每個個別的物件必須包含的所有屬性和父類別的方法。不用到說這即將混淆類別精靈時數之 DISPID 的時間。如果您是使用類別精靈,請確定再次檢查產生的 DISPID 在兩個地方:.odl 檔案自動化類別和類別定義的內部列舉型別。使用按鈕在衍生的類別時很容易就能看到相同的 DISPID 指派給多個屬性和方法。它會更容易修正 [DISPID 不過,比若要將所有項目加入由從頭開始,所以功能已被離開 MfcAxscrVb 中。

使用 Visual C++ 5.0 的改良支援的 IDL 方法和屬性透過 ClassView,將是往上或不是否需要 ClassWizard 拋。但 MfcAxscrVb 它現在支援。享受。

附錄 a: 物件模型

Scripter:

這是主要從中衍生其他所有物件的物件。它是 「 IMfcaxscrvbDlg".odl 檔案中的,但會新增為具名的項目"Scripter]。它有一種方法,上面所述的 HostCreateObject。

Button 物件:

AButton BButton CancelButton OKButton RunScript

屬性
  • 標題: 文字的按鈕圖面。
方法 請按: 的作用如同按鈕被推入。
  • 請按: 的作用如同按鈕被推入。
事件
  • OnClick: 發生於按下按鈕時。
  • OnMouseOver: 發生於滑鼠會變換按鈕。
  • OnFocus(bSet): 引發給予焦點時或取自] 按鈕。
BroCon:

BroCon 是 WebBrowser 控制項] 對話方塊上的名稱。它支援所有的屬性和方法,如網際網路用戶端 SDK/ActiveX SDK WebBrowser 控制項中。

EditCon:

方法
  • AppendLine(strToAdd): 新增 strToAdd 結束的編輯文字視窗。
  • InsertLine strToAdd (nWhere): 在行 #nWhere 新增 strToAdd。
  • RemoveLine(nWhere): 從編輯視窗中移除線條 # nWhere。
事件
  • OnMouseOver: 發生於滑鼠會變換視窗。
  • OnChar(strChar): 引發視窗中輸入字元 strChar 時。
  • OnFocus(bSet): 引發給予焦點時或取自] 按鈕。
Lbox:

方法
  • AddString(strIn): 新增 StrIn 到清單方塊。
  • ClearList: 清除所有的字串,從清單方塊。
  • RemoveString(strRemove): 移除 StrRemove 的第一個執行個體,並移除清單方塊。
  • SelectString(strSelect): 選取 strSelect 所指定的字串。
事件
  • OnMouseOver: 發生於滑鼠會變換視窗。
  • OnFocus(bSet): 引發給予焦點時或取自] 按鈕。
  • OnSelCancel(strCancelled): 當選取範圍取消在清單方塊項目 strCancelled。
  • OnSelChange(strChange): 當清單方塊項目 strChange 是由使用者選取。

屬性

文章編號: 168214 - 上次校閱: 2004年8月5日 - 版次: 2.2
這篇文章中的資訊適用於:
  • Microsoft Internet Explorer 3.01
  • Microsoft Internet Explorer 3.02
  • Microsoft Internet Explorer 4.0 128-Bit Edition
  • Microsoft Internet Explorer 4.01 Service Pack 2
  • Visual Basic Scripting 版 1.0
  • Microsoft Visual Basic Scripting 版 1.1
  • Visual Basic Scripting 版 2.0
  • Microsoft Foundation Class Library 4.2?應用於:
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 5.0 Professional Edition
關鍵字:?
kbmt kbdownload kbfile kbinfo kbsample KB168214 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:168214
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。
依現狀不再更新的知識庫內容免責聲明
本文旨在說明 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