共用方式為


在 Visual Studio SDK 中公開事件

Visual Studio 可讓您使用自動化來取得事件。 建議您為專案和專案項目取得事件。

自動化使用者從 Events 物件或 GetObject (例如:GetObject("EventObjectName")) 擷取事件。 環境使用 DISPATCH_METHODDISPATCH_PROPERTYGET 旗標呼叫 IDispatch::Invoke 以傳回事件。

下列流程說明如何傳回 VSPackage 特定事件。

  1. 環境啟動。

  2. 它會從登錄中讀取所有 VSPackage 的 AutomationAutomationEventsAutomationProperties 機碼下的所有值名稱,並將這些名稱儲存在資料表中。

  3. 在此範例中,自動化使用者呼叫 DTE.Events.AutomationProjectsEventsDTE.Events.AutomationProjectItemsEvents

  4. 環境會在資料表中尋找字串參數,並載入對應的 VSPackage。

  5. 環境會使用傳入呼叫的名稱來呼叫 GetAutomationObject 方法;在此範例中為 AutomationProjectsEventsAutomationProjectItemsEvents

  6. VSPackage 建立具有 get_AutomationProjectsEventsget_AutomationProjectItemEvents 等方法的根物件,然後傳回物件的 IDispatch 指標。

  7. 環境根據傳遞至自動化呼叫的名稱來呼叫適當的方法。

  8. get_ 方法建立另一個以 IDispatch 為基礎的事件物件,這個物件會同時實作 IConnectionPointContainer 介面和 IConnectionPoint 介面,並將 IDispatchpointer 傳回物件。

    為了使用自動化公開事件,您必須回應 GetAutomationObject 並監視新增至登錄的字串。 在基本專案範例中,字串為 BscProjectsEventsBscProjectItemsEvents

基本專案範例中的登錄項目

本節說明將自動化事件值新增至登錄的位置。

[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 方法。

Visual Studio 專案事件

事件的自動化模型

類別 CProjectEventsContainer 代表 BscProjectsEvents 的來源物件,CProjectItemsEventsContainer 代表 BscProjectItemsEvents 的來源物件。

在大部分情況下,您必須針對每個事件要求傳回新的物件,因為大部分的事件物件都會採用篩選物件。 當您觸發事件時,請檢查此篩選以確認正在呼叫事件處理常式。

AutomationEvents.hAutomationEvents.cpp 包含下表中類別的宣告和實作。

類別 描述
CAutomationEvents 實作從 DTE.Events 物件擷取的事件根物件。
CProjectsEventsContainerCProjectItemsEventsContainer 實作觸發對應事件的事件來源物件。

下列程式碼範例示範如何回應事件物件的要求。

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 介面事件的終端使用者來說,無法立即清楚從何處擷取該事件物件。