在 Visual Studio SDK 中公開事件
Visual Studio 可讓您使用自動化來取得事件。 建議您為專案和專案項目取得事件。
自動化使用者從 Events 物件或 GetObject (例如:GetObject("EventObjectName")
) 擷取事件。 環境使用 DISPATCH_METHOD
或 DISPATCH_PROPERTYGET
旗標呼叫 IDispatch::Invoke
以傳回事件。
下列流程說明如何傳回 VSPackage 特定事件。
環境啟動。
它會從登錄中讀取所有 VSPackage 的 Automation、AutomationEvents 和 AutomationProperties 機碼下的所有值名稱,並將這些名稱儲存在資料表中。
在此範例中,自動化使用者呼叫
DTE.Events.AutomationProjectsEvents
或DTE.Events.AutomationProjectItemsEvents
。環境會在資料表中尋找字串參數,並載入對應的 VSPackage。
環境會使用傳入呼叫的名稱來呼叫 GetAutomationObject 方法;在此範例中為
AutomationProjectsEvents
或AutomationProjectItemsEvents
。VSPackage 建立具有
get_AutomationProjectsEvents
和get_AutomationProjectItemEvents
等方法的根物件,然後傳回物件的 IDispatch 指標。環境根據傳遞至自動化呼叫的名稱來呼叫適當的方法。
get_
方法建立另一個以 IDispatch 為基礎的事件物件,這個物件會同時實作IConnectionPointContainer
介面和IConnectionPoint
介面,並將IDispatchpointer
傳回物件。為了使用自動化公開事件,您必須回應 GetAutomationObject 並監視新增至登錄的字串。 在基本專案範例中,字串為 BscProjectsEvents 和 BscProjectItemsEvents。
基本專案範例中的登錄項目
本節說明將自動化事件值新增至登錄的位置。
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\8.0\Packages\<PkgGUID>\AutomationEvents]
AutomationProjectEvents = Returns the AutomationProjectEvents
object.
AutomationProjectItemEvents = Returns the AutomationProjectItemsEvents
object.
名稱 | 類型 | 範圍 | 描述 |
---|---|---|---|
預設 (@) | REG_SZ | 未使用 | 未使用的。 您可以使用資料欄位來取得文件。 |
AutomationProjectsEvents | REG_SZ | 事件物件的名稱。 | 只有機碼名稱是相關的。 您可以使用資料欄位來取得文件。 此範例來自基本專案範例。 |
AutomationProjectItemEvents | REG_SZ | 事件物件的名稱 | 只有機碼名稱是相關的。 您可以使用資料欄位來取得文件。 此範例來自基本專案範例。 |
當自動化使用者要求任何事件物件時,請建立根物件,其中包含 VSPackage 支援的任何事件之方法。 環境會在此物件上呼叫適當的 get_
方法。 例如,如果呼叫 DTE.Events.AutomationProjectsEvents
,則會叫用根物件上的 get_AutomationProjectsEvents
方法。
事件的自動化模型
類別 CProjectEventsContainer
代表 BscProjectsEvents 的來源物件,CProjectItemsEventsContainer
代表 BscProjectItemsEvents 的來源物件。
在大部分情況下,您必須針對每個事件要求傳回新的物件,因為大部分的事件物件都會採用篩選物件。 當您觸發事件時,請檢查此篩選以確認正在呼叫事件處理常式。
AutomationEvents.h 和 AutomationEvents.cpp 包含下表中類別的宣告和實作。
類別 | 描述 |
---|---|
CAutomationEvents |
實作從 DTE.Events 物件擷取的事件根物件。 |
CProjectsEventsContainer 和 CProjectItemsEventsContainer |
實作觸發對應事件的事件來源物件。 |
下列程式碼範例示範如何回應事件物件的要求。
STDMETHODIMP CVsPackage::GetAutomationObject(
/* [in] */ LPCOLESTR pszPropName,
/* [out] */ IDispatch ** ppIDispatch)
{
ExpectedPtrRet(ppIDispatch);
*ppIDispatch = NULL;
if (_wcsicmp(pszPropName, g_wszAutomationProjects) == 0)
//Is the requested name our Projects object?
{
return GetAutomationProjects(ppIDispatch);
// Gets our Projects object.
}
else if (_wcsicmp(pszPropName, g_wszAutomationProjectsEvents) == 0)
//Is the requested name our ProjectsEvents object?
{
return CAutomationEvents::GetAutomationEvents(ppIDispatch);
// Gets our ProjectEvents object.
}
else if (_wcsicmp(pszPropName, g_wszAutomationProjectItemsEvents) == 0) //Is the requested name our ProjectsItemsEvents object?
{
return CAutomationEvents::GetAutomationEvents(ppIDispatch);
// Gets our ProjectItemsEvents object.
}
return E_INVALIDARG;
}
在上述程式碼中,g_wszAutomationProjects
是專案集合的名稱 (FigProjects)、g_wszAutomationProjectsEvents
(FigProjectsEvents) 和 g_wszAutomationProjectItemsEvents
(FigProjectItemEvents) 是來自 VSPackage 實作的專案事件和專案項目事件之名稱。
事件物件是從相同的中央位置擷取,也就是 DTE.Events
物件。 如此一來,所有事件物件都會分組在一起,讓使用者不需要瀏覽整個物件模型來尋找特定事件。 這也可讓您提供特定的 VSPackage 物件,而不需要您為系統範圍的事件實作自己的程式碼。 不過,對於必須尋找 ProjectItem
介面事件的終端使用者來說,無法立即清楚從何處擷取該事件物件。