共用方式為


將專案物件公開

Visual Studio提供動態的環境,其中 VSPackages 可擴充完美地參與 Visual Studio 的 automation 模型。 這些新的物件延伸 automation 模型DTE物件。

DTE物件是在 Visual Studio 的自動化模型的主要物件。 在頂端位於Visual Studio自動化物件階層架構。

VSPackage 特定物件的名稱儲存在登錄中,並建立並傳回物件的程式碼是 VSPackage 實作的一部分。 下列程序將告訴您如何找到 VSPackage 特有物件。

  1. Visual Studio整合 develpment 環境 (IDE) 開始。

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

  3. 自動化消費者會呼叫GetObject方法或IDispatch::GetIDsOfNames,並傳遞至物件的名稱,如下所示:

    DTE.GetObject("VCProjects")
    
  4. IDE 會尋找資料表中的字串參數,並載入相對應的 VSPackage。

  5. IDE 呼叫GetAutomationObject所使用的名稱,例如"VCProjects"傳送到此呼叫的方法。

  6. VSPackage 建立並傳回IDispatch物件的指標。 如果物件已經存在,其參考計數會漸增。 在這個範例中,呼叫端傳遞回指標標準Projects集合物件,即由 Visual c + + 實作。

  7. 傳回的物件是專案的查看其餘的 automation 物件的進入點。

取得特定之後Projects物件,請使用Item方法,以取得Project對應至 Visual c + + 專案的物件。 取得標準之後Project物件,呼叫Object以取得專案的特定物件的物件。 Object物件是您用來傳回物件延伸至Project使用您的唯一的方法和屬性的物件。 您甚至可以建立並傳回其他物件。

您想要公開 (expose) 的 automation 物件的名稱儲存為字串值,從下列登錄機碼名稱:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\8.0\Packages\ <PkgGUID> \Automation]

注意事項注意事項

<PkgGUID> 的文字 代表您 VSPackage 的實際的 GUID。

下列程式碼範例和表格包含一般的登錄項目。

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\8.0\Packages\ <PkgGUID> \Automation]

@=""

"FigProjects"="數字專案自動化物件 」

名稱

型別

Range

描述

預設 (@)

REG_SZ

null

未使用。 您可以使用這個文件。

FigProjects

REG_SZ

您唯一的專案集合物件的名稱。

索引鍵的名稱才適宜。 如需文件,您可以使用 [資料] 欄位。

提供新的專案類型的所有 VSPackages 都應該都提供自動化的物件。 例如, Visual C++建立 VSPackage 特有物件的增益集就可以透過呼叫DTE.VCProjectsDTE.GetObject("VCProjects") 以取得專案的物件的Visual C++到Projects集合。 Projects和其包含Project項目都是Visual C++實作但遵循標準模式。 不過,消費者可以進入Project.Object,這都是唯一的專案類型而定,而且可以提供自己唯一的物件。 專案 automation 模型也可以讓Project.CodeModel,它可以查詢最具衍生性的物件 (VCCodeModel)。

也會發生同樣ProjectItem,它也會呈現ProjectItem.Object,以及FileCodeModel

Visual C++ VSPackage,然後建立的物件,將傳回自動化消費者。

參與專案的 VSPackage 特定物件

  1. 您 VSPackage 的登錄設定值中加入適當的索引鍵。

  2. 實作中的程式碼GetAutomationObjectIVsPackage介面,會傳回IDispatch物件。

    下列程式碼範例會示範 GetAutomationObject 方法的實作。

    Private Function GetAutomationObject(ByVal pszPropName As LPCOLESTR, ByVal ppIDispatch As IDispatch**) As STDMETHODIMP Implements CVsPackage.GetAutomationObject 
        ExpectedPtrRet(ppIDispatch) 
        *ppIDispatch = NULL 
    
        If _wcsicmp(pszPropName, g_wszAutomationProjects) = 0 Then 
           'Is the requested name our Projects object? 
           ' Gets our Projects object 
           Return GetAutomationProjects(ppIDispatch) 
        ElseIf _wcsicmp(pszPropName, g_wszAutomationProjectsEvents) = 0 Then 
            'Is the requested name our ProjectsEvents object? 
            ' Gets our ProjectEvents object 
            Return CAutomationEvents.GetAutomationEvents(ppIDispatch) 
        ElseIf _wcsicmp(pszPropName, g_wszAutomationProjectItemsEvents) = 0 Then 
            'Is the requested name our ProjectsItemsEvents object? 
            ' Gets our ProjectItemsEvents object 
            Return CAutomationEvents.GetAutomationEvents(ppIDispatch) 
        End If 
        Return E_INVALIDARG 
    End Function 
    
    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",登錄在 <PkgGUID> \Automation 機碼 (如圖所示的登錄項目) 的字串。 GetAutomationProjects方法會建立物件,實作Projects介面,並傳回IDispatch指標呼叫的物件,如下列程式碼範例所示。

    Private Function GetAutomationProjects(ByVal ppIDispatch As IDispatch**) As HRESULT Implements CVsPackage.GetAutomationProjects 
        ExpectedPtrRet(ppIDispatch) 
        *ppIDispatch = NULL 
    
        If Not m_srpAutomationProjects Then 
            Dim hr As HRESULT = CACProjects.CreateInstance(AddressOf m_srpAutomationProjects) 
            IfFailRet(hr) 
            ExpectedExprRet(m_srpAutomationProjects <> NULL) 
        End If 
        Return m_srpAutomationProjects.CopyTo(ppIDispatch) 
    End Function
    
    HRESULT CVsPackage::GetAutomationProjects(/* [out] */ IDispatch ** ppIDispatch)
    {
        ExpectedPtrRet(ppIDispatch);
        *ppIDispatch = NULL;
    
        if (!m_srpAutomationProjects)
        {
            HRESULT hr = CACProjects::CreateInstance(&m_srpAutomationProjects);
            IfFailRet(hr);
            ExpectedExprRet(m_srpAutomationProjects != NULL);
        }
        return m_srpAutomationProjects.CopyTo(ppIDispatch);
    }
    

    您應該選擇您的 automation 物件的唯一名稱。 名稱衝突會發生無法預期的而且衝突導致任意擲回如果多個 VSPackages 使用相同的名稱衝突的物件名稱。 若要避免這種衝突,我們建議您包含您公司的名稱或它的產品名稱,automation 物件的名稱某些唯一特性。

    Projects集合物件是您專案的自動化模型的其餘部分的進入點。 建立提供消費者與適當的程式碼和登錄項目之後Projects集合物件,您的實作必須提供剩下標準的專案模型的物件。 如需詳細資訊,請參閱 專案模型

請參閱

參考

GetAutomationObject

概念

專案模型