共用方式為


公開 Visual Studio 的 SDK 中的事件

Visual Studio可讓您藉由使用自動化來源事件。 我們建議您來源專案和專案項目所用的事件。

從自動化消費者擷取事件Events物件或GetObject ("EventObjectName")。 環境呼叫IDispatch::Invoke藉由使用DISPATCH_METHOD或DISPATCH_PROPERTYGET傳回事件的旗標。

下列程序會說明 VSPackage 專屬事件傳回的方式。

  1. 環境啟動時。

  2. 它會從登錄中讀取所有的 VSPackages 的自動化、 AutomationEvents 和 AutomationProperties 機碼之下的所有值名稱,並將這些名稱儲存在資料表中。

  3. 自動化消費者呼叫時,在這個範例中, DTE.Events.AutomationProjectsEvents或DTE.Events.AutomationProjectItemsEvents。

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

  5. 環境呼叫GetAutomationObject方法,可以使用名稱傳送到此呼叫。 在這個範例中,AutomationProjectsEvents 或 AutomationProjectItemsEvents。

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

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

  8. 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根物件上的方法被叫用。

自動化模型的事件

Visual Studio 專案事件

類別CProjectEventsContainer BscProjectsEvents,表示來源物件時CProjectItemsEventsContainer BscProjectItemsEvents 表示來源物件。

在大部分的情況下,您必須傳回每個事件要求新的物件,因為大部分的事件物件都接受篩選器物件。 當引發事件時,檢查此篩選器,以確認呼叫的事件處理常式。

AutomationEvents.h 和 AutomationEvents.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介面,它不立即清楚從那個 event 物件擷取的位置。

請參閱

參考

GetAutomationObject

概念

Visual Studio 的擴充性範例