カスタム プロジェクト タイプでは、オートメーション インターフェイスを使用してプロジェクトにアクセスできるようにするために、オートメーションオブジェクトを提供できます。 すべてのプロジェクト タイプは、Solution からアクセスされる標準の Project オートメーション オブジェクトを提供することが想定されています。このオブジェクトには、IDE で開いているすべてのプロジェクトのコレクションが含まれています。 プロジェクト内の各項目は、Project.ProjectItems を使用してアクセスされる ProjectItem オブジェクトによって公開されることが想定されています。 これらの標準オートメーション オブジェクトに加えて、プロジェクトではプロジェクト固有のオートメーション オブジェクトを提供することを選択できます。
DTE.<customObjectName> または DTE.GetObject("<customObjectName>") を使用してルート DTE オブジェクトから遅延バインディングにアクセスできる、カスタムのルートレベル オートメーション オブジェクトを作成できます。 たとえば、Visual C++ では、DTE.VCProjects または DTE.GetObject("VCProjects") を使用してアクセスできる VCProjects という C++ プロジェクト固有のプロジェクト コレクションを作成します。 プロジェクト タイプに対して一意である Project.Object、最派生オブジェクトに対してクエリを実行できる Project.CodeModel、および ProjectItem.Object や ProjectItem.FileCodeModel を公開する ProjectItem を作成することもできます。
一般的な規則として、プロジェクトではプロジェクト固有のカスタム プロジェクト コレクションを公開します。 たとえば、Visual C++ では、DTE.VCProjects または DTE.GetObject("VCProjects") を使用してアクセスできる C++ 固有のプロジェクト コレクションが作成されます。 プロジェクト タイプに対して一意である Project.Object、最派生オブジェクトに対してクエリを実行できる Project.CodeModel、ProjectItem.Object を公開する ProjectItem、および 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コレクション オブジェクトを提供する適切なコードとレジストリ エントリを作成したら、実装でプロジェクト モデルの残りの標準オブジェクトを提供する必要があります。 詳細については、「プロジェクトのモデリング」を参照してください。