自訂專案類型可以提供自動化物件,以允許使用自動化介面存取專案。 每個專案類型都預期會提供從 Solution 存取的標準 Project 自動化物件,其中包含在 IDE 中開啟之所有專案的集合。 專案中的每個項目都應該由使用 Project.ProjectItems 存取的 ProjectItem 物件公開。 除了這些標準自動化物件之外,專案還可以選擇提供專案特定的自動化物件。
您可以建立自訂根層級自動化物件,以使用 DTE.<customObjectName> 或 DTE.GetObject("<customObjectName>") 從根 DTE 物件存取晚期繫。 例如,Visual C++ 會建立名為 VCProjects 的 C++ 專案特定專案集合,您可以使用 DTE.VCProjects 或 DTE.GetObject("VCProjects") 存取專案集合。 您還可以建立對於專案類型來說是唯一的 Project.Object、可以查詢其最高衍生物件的 Project.CodeModel 以及 ProjectItem (公開 ProjectItem.Object 和 ProjectItem.FileCodeModel)。
專案通常公開自訂的、特定於專案的專案集合。 例如,Visual C++ 會建立 C++ 特定的專案集合,然後您可以使用 或 DTE.VCProjects 或 DTE.GetObject("VCProjects") 來存取。 您還可以建立對於專案類型來說是唯一的 Project.Object、可以查詢其最高衍生物件的 Project.CodeModel、ProjectItem (公開 ProjectItem.Object 和 ProjectItem.FileCodeModel)。
為專案提供 VSPackage 特定物件
將適當的金鑰新增至 VSPackage 的 .pkgdef 檔案。
例如,以下是 C++ 語言專案的 .pkgdef 設定:
[$RootKey$\Packages\{F1C25864-3097-11D2-A5C5-00C04F7968B4}\Automation] "VCProjects"="" [$RootKey$\Packages\{F1C25864-3097-11D2-A5C5-00C04F7968B4}\AutomationEvents] "VCProjectEngineEventsObject"=""實作 GetAutomationObject 方法中的程式碼,如下列範例所示。
STDMETHODIMP CVsPackage::GetAutomationObject( /* [in] */ LPCOLESTR pszPropName, /* [out] */ IDispatch ** ppIDispatch) { ExpectedPtrRet(pszPropName); ExpectedPtrRet(ppIDispatch); *ppIDispatch = NULL; if (m_fZombie) return E_UNEXPECTED; if (_wcsicmp(pszPropName, g_wszAutomationProjects) == 0) { return GetAutomationProjects(ppIDispatch); } else if (_wcsicmp(pszPropName, g_wszAutomationProjectsEvents) == 0) { return CAutomationEvents::GetAutomationEvents(ppIDispatch); } else if (_wcsicmp(pszPropName, g_wszAutomationProjectItemsEvents) == 0) { return CAutomationEvents::GetAutomationEvents(ppIDispatch); } return E_INVALIDARG; }在程式代碼中,
g_wszAutomationProjects是專案集合的名稱。GetAutomationProjects方法建立一個實作Projects介面的物件,並傳回呼叫物件的指標IDispatch,如下列程式碼範例所示。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); }為自動化物件選擇唯一的名稱。 名稱衝突是無法預測的,如果多個專案類型使用相同的名稱,衝突會導致任意擲回衝突的物件名稱。 在自動化物件名稱中應包含公司名稱或其產品名稱的某些獨特層面。
自訂
Projects集合物件是專案自動化模型其餘部分的便利進入點。 您也可以從 Solution 專案集合存取您的專案物件。 建立為使用者提供Projects集合物件的適當程式碼和登錄項目後,您的實作必須為專案模型提供其餘的標準物件。 如需詳細資訊,請參閱專案模型化。