專案子類型的初始化順序
環境呼叫的基底專案工廠實作來建構專案CreateProject。 專案檔案的副檔名的專案類型的 GUID 清單不是空的環境決定時,就會啟動專案的子型別建構。 將專案檔案的副檔名] 和 [GUID 的專案指定專案是否Visual Basic或Visual C#專案類型。 比方說,.vbproj 副檔名,並找出 {F184B08F-C81C-45F6-A57F-5ABD9991F28F} Visual Basic專案。
專案子類型的環境的初始設定
下列程序詳細說明專案系統,由多個專案的子型別彙總初始設定順序。
環境呼叫基底專案的CreateProject,專案會剖析它的專案檔時發現不是彙總的專案類型的 Guid 清單,並null。 專案會停止直接建立它的專案。
專案呼叫QueryService的SVsCreateAggregateProject服務,來建立專案子類型使用的環境的實作CreateAggregateProject方法。 這個方法內的環境可讓您實作的遞迴函式呼叫PreCreateForOuter, **M:Microsoft.VisualStudio.Shell.Interop.IVsAggregatableProject.SetInnerProject(System.Object)**和InitializeForOuter方法,而它查核專案的清單型別開始的最外層的專案子類型的 Guid。
以下將詳細說明的初始化步驟。
環境的實作CreateAggregateProject方法呼叫HrCreateInnerProj包含下列的函式宣告的方法:
HRESULT HrCreateInnerProj ( WCHAR *pwszGuids, IUnknown *pOuter, IVsAggregatableProject *pOwner, LPCOLESTR pszFilename, LPCOLESTR pszLocation, LPCOLESTR pszName, VSCREATEPROJFLAGS grfCreateFlags, IUnknown **ppInner, BOOL *pfCancelled )
這個函式呼叫時第一次,也就是對最外層的專案子型別參數pOuter和pOwner做為傳入的null函式會設定最外層的專案子類型與IUnknown到pOuter。
接下來環境呼叫HrCreateInnerProj與第二個專案中的型別 GUID 清單的函式。 這個 GUID 對應至基底的專案中,彙總的序列向逐步執行的第二個內嵌專案子類型。
pOuter現在指向IUnknown的最外層的專案子型別,和HrCreateInnerProj的實作會呼叫PreCreateForOuter後面的實作呼叫SetInnerProject。 在PreCreateForOuter控制您所傳遞的方法IUnknown的最外層的專案子類型中, pOuter。 擁有的專案 (內嵌專案子類型),就必須建立它的彙總的專案物件。 在SetInnerProject您傳入的指標的方法實作IUnknown的彙總內部的專案。 這兩種方法建立彙總物件,而且您的實作需要遵守 COM 彙總規則,以確保專案子類型沒有結束最多保留對其本身的參考次數。
HrCreateInnerProj您的實作會呼叫PreCreateForOuter。 這種方法的專案子類型進行初始設定工作。 您可以,比方說,註冊方案中的事件InitializeForOuter。
HrCreateInnerProj會呼叫以遞迴方式,直到到達最後一個 GUID (基底的專案),在清單中。 針對每一個這些呼叫,請重複步驟 c 到 d。 pOuter指到最外層的專案子類型IUnknown每個層級的彙總。
下列範例詳述大約表示中以程式設計方式的程序CreateAggregateProject環境由存取關聯式資料庫為它的方法。 程式碼只是一個範例。 它並不適合進行編譯,並使文字更明確移除了所有的錯誤檢查。
範例
程式碼
HRESULT CreateAggregateProject
(
LPCOLESTR lpstrGuids,
LPCOLESTR pszFilename,
LPCOLESTR pszLocation,
LPCOLESTR pszName,
VSCREATEPROJFLAGS grfCreateFlags,
REFIID iidProject,
void **ppvProject)
{
HRESULT hr = NOERROR;
CComPtr<IUnknown> srpunkProj;
CComPtr<IVsAggregatableProject> srpAggProject;
CComBSTR bstrGuids = lpstrGuids;
BOOL fCanceled = FALSE;
*ppvProject = NULL;
HrCreateInnerProj(
bstrGuids, NULL, NULL, pszFilename, pszLocation,
pszName, grfCreateFlags, &srpunkProj, &fCanceled);
srpunkProj->QueryInterface(
IID_IVsAggregatableProject, (void **)&srpAggProject));
srpAggProject->OnAggregationComplete();
srpunkProj->QueryInterface(iidProject, ppvProject);
}
HRESULT HrCreateInnerProj
(
WCHAR *pwszGuids,
IUnknown *pOuter,
IVsAggregatableProject *pOwner,
LPCOLESTR pszFilename,
LPCOLESTR pszLocation,
LPCOLESTR pszName,
VSCREATEPROJFLAGS grfCreateFlags,
IUnknown **ppInner,
BOOL *pfCanceled
)
{
HRESULT hr = NOERROR;
CComPtr<IUnknown> srpInner;
CComPtr<IVsAggregatableProject> srpAggInner;
CComPtr<IVsProjectFactory> srpProjectFactory;
CComPtr<IVsAggregatableProjectFactory> srpAggPF;
GUID guid = GUID_NULL;
WCHAR *pwszNextGuids = wcschr(pwszGuids, L';');
WCHAR wszText[_MAX_PATH+150] = L"";
if (pwszNextGuids)
{
*pwszNextGuids++ = 0;
}
CLSIDFromString(pwszGuids, &guid);
GetProjectTypeMgr()->HrGetProjectFactoryOfGuid(
guid, &srpProjectFactory);
srpProjectFactory->QueryInterface(
IID_IVsAggregatableProjectFactory,
(void **)&srpAggPF);
srpAggPF->PreCreateForOuter(pOuter, &srpInner);
srpInner->QueryInterface(
IID_IVsAggregatableProject, (void **)&srpAggInner);
if (pOwner)
{
IfFailGo(pOwner->SetInnerProject(srpInner));
}
if (pwszNextGuids)
{
CComPtr<IUnknown> srpNextInner;
HrCreateInnerProj(
pwszNextGuids, pOuter ? pOuter : srpInner,
srpAggInner, pszFilename, pszLocation, pszName,
grfCreateFlags, &srpNextInner, pfCanceled);
}
return srpAggInner->InitializeForOuter(
pszFilename, pszLocation, pszName, grfCreateFlags,
IID_IUnknown, (void **)ppInner, pfCanceled);
}
請參閱
參考
Microsoft.VisualStudio.Shell.Flavor