將專案物件公開
Visual Studio提供動態的環境,其中 VSPackages 可擴充完美地參與 Visual Studio 的 automation 模型。 這些新的物件延伸 automation 模型DTE物件。
DTE物件是在 Visual Studio 的自動化模型的主要物件。 在頂端位於Visual Studio自動化物件階層架構。
VSPackage 特定物件的名稱儲存在登錄中,並建立並傳回物件的程式碼是 VSPackage 實作的一部分。 下列程序將告訴您如何找到 VSPackage 特有物件。
Visual Studio整合 develpment 環境 (IDE) 開始。
它會從登錄中讀取所有的 VSPackages 的自動化、 AutomationEvents 和 AutomationProperties 機碼之下的所有值名稱,並將這些名稱儲存在資料表中。
自動化消費者會呼叫GetObject方法或IDispatch::GetIDsOfNames,並傳遞至物件的名稱,如下所示:
DTE.GetObject("VCProjects")
IDE 會尋找資料表中的字串參數,並載入相對應的 VSPackage。
IDE 呼叫GetAutomationObject所使用的名稱,例如"VCProjects"傳送到此呼叫的方法。
VSPackage 建立並傳回IDispatch物件的指標。 如果物件已經存在,其參考計數會漸增。 在這個範例中,呼叫端傳遞回指標標準Projects集合物件,即由 Visual c + + 實作。
傳回的物件是專案的查看其餘的 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.VCProjects或DTE.GetObject("VCProjects") 以取得專案的物件的Visual C++到Projects集合。 Projects和其包含Project項目都是Visual C++實作但遵循標準模式。 不過,消費者可以進入Project.Object,這都是唯一的專案類型而定,而且可以提供自己唯一的物件。 專案 automation 模型也可以讓Project.CodeModel,它可以查詢最具衍生性的物件 (VCCodeModel)。
也會發生同樣ProjectItem,它也會呈現ProjectItem.Object,以及FileCodeModel。
Visual C++ VSPackage,然後建立的物件,將傳回自動化消費者。
參與專案的 VSPackage 特定物件
您 VSPackage 的登錄設定值中加入適當的索引鍵。
實作中的程式碼GetAutomationObject的IVsPackage介面,會傳回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集合物件,您的實作必須提供剩下標準的專案模型的物件。 如需詳細資訊,請參閱 專案模型。