公開 Visual Studio 的 SDK 中的事件
Visual Studio可讓您藉由使用自動化來源事件。 我們建議您來源專案和專案項目所用的事件。
從自動化消費者擷取事件Events物件或GetObject ("EventObjectName")。 環境呼叫IDispatch::Invoke藉由使用DISPATCH_METHOD或DISPATCH_PROPERTYGET傳回事件的旗標。
下列程序會說明 VSPackage 專屬事件傳回的方式。
環境啟動時。
它會從登錄中讀取所有的 VSPackages 的自動化、 AutomationEvents 和 AutomationProperties 機碼之下的所有值名稱,並將這些名稱儲存在資料表中。
自動化消費者呼叫時,在這個範例中, DTE.Events.AutomationProjectsEvents或DTE.Events.AutomationProjectItemsEvents。
環境在資料表中尋找字串參數,並載入相對應的 VSPackage。
環境呼叫GetAutomationObject方法,可以使用名稱傳送到此呼叫。 在這個範例中,AutomationProjectsEvents 或 AutomationProjectItemsEvents。
VSPackage 建立根物件,例如具有方法get_AutomationProjectsEvents和get_AutomationProjectItemEvents ,然後傳回給物件的 [IDispatch 指標。
環境呼叫適當的方法,以傳遞至自動化呼叫的名稱。
get_方法會建立另一個 IDispatch 為基礎的事件物件實作兩個IConnectionPointContainer介面和IConnectionPoint介面,並傳回 IDispatch物件的指標。
若要使用自動化來公開事件,您必須回應GetAutomationObject ,並監看式的字串時,您將加入至登錄。 在基本的專案範例中,字串會是"BscProjectsEvents"和"BscProjectItemsEvents"。
登錄項目,從基本專案範例
本節說明如何自動化事件值新增到登錄。
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\8.0\Packages\ <PkgGUID> \AutomationEvents]
"AutomationProjectEvents"="會傳回 AutomationProjectEvents 物件"
"AutomationProjectItemEvents"="會傳回 AutomationProjectItemsEvents 物件"
名稱 |
型別 |
Range |
描述 |
---|---|---|---|
預設 (@) |
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介面,它不立即清楚從那個 event 物件擷取的位置。