Freigeben über


Initialisierungs-Sequenz von Projekt-Untertypen

Die Umgebung erstellt ein Projekt, indem sie die Implementierung des CreateProjectfactory Projekt aufruft. Beim Erstellen eines Projekts untertyps beginnt, wenn die Umgebung bestimmt, ob die Liste des Projekttyps GUID für die Erweiterung einer Projektdatei nicht leer ist. Die Projektdatei Namespaceerweiterung und der Projekt-GUID geben an, ob das Projekt ein, oder  Visual BasicVisual C# Projekttyp ist. Zum Beispiel identifizieren die .vbproj-Erweiterung C81 C-45F6-A57F-5ABD9991F28F} und {F184B08F- ein Visual Basic Projekt.

Die Initialisierung der Umgebung aus Projekt-Untertypen

Die folgenden Schritte sind, die die Initialisierung für ein Projektsystem Sequenz von mehreren Projekt untertypen aggregierte.

  1. Die Umgebung wird das Basis- CreateProjectdes Projekts und während das Projekt die Projektdatei analysiert es ermittelt, dass die gesamte Liste des Projekttyps GUID nicht nullist. Das Projekt wird ein Projekt, das direkt erstellen.

  2. Das Projekt wird QueryService auf SVsCreateAggregateProject Dienst auf, um einen untertyp Projekt mithilfe der Implementierung der Umgebung der CreateAggregateProject-Methode zu erstellen. Innerhalb dieser Methode werden die Umgebung rekursiven Funktionsaufrufe Implementierungen von PreCreateForOuter, M:Microsoft.VisualStudio.Shell.Interop.IVsAggregatableProject.SetInnerProject(System.Object) und InitializeForOuter-Methode, um zunächst die Liste des Projekttyps GUID durchläuft, beginnend mit der äußersten Projekt untertyp.

    Die folgenden Details der Initialisierung Bereitstellungsschritte.

    1. Die Implementierung der Umgebung der Methode CreateAggregateProject methodenaufruf- HrCreateInnerProjmit der folgenden Funktionsdeklaration aufgeführt wird:

      HRESULT HrCreateInnerProj
      (
          WCHAR *pwszGuids,
          IUnknown *pOuter,
          IVsAggregatableProject *pOwner,
          LPCOLESTR pszFilename,
          LPCOLESTR pszLocation,
          LPCOLESTR pszName,
          VSCREATEPROJFLAGS grfCreateFlags,
          IUnknown **ppInner,
          BOOL *pfCancelled
      )
      

      Wenn diese Funktion zum ersten Mal d. h. für den äußeren Projekt untertyp aufgerufen wird, werden die Parameter pOuter und pOwner übergeben, während null und die Funktion den äußersten Projekt untertyp IUnknown zu pOuterfestlegt.

    2. Als Nächstes die Umgebung aufrufs- HrCreateInnerProj-Funktion mit dem zweiten Projekttyp-GUID in der Liste. Dieses GUID entspricht dem zweiten inneren Projekt untertyp hin, der dem Basis- Projekt in der Sequenz Aggregations.

    3. pOuter verweist nun auf IUnknown des äußeren untertyps Projekt, und HrCreateInnerProj Aufrufe, die die Implementierung von PreCreateForOuter von einem Aufruf der Implementierung von SetInnerProjecterfolgreich war. In PreCreateForOuter-Methode übergeben Sie steuernde IUnknown des äußersten Projekt untertyps, pOuter. Das Besitze Projekt (innerer Projekt untertyp hier Projektobjekt ganzes sein muss) erstellen. In der SetInnerProject-Methodenimplementierung übergeben Sie einen Zeiger auf IUnknown des inneren Projekts, die aggregiert wird. Diese beiden Methoden erstellen das Aggregations Objekt und die Implementierung COM-Aggregations regeln, zu folgen, um sicherzustellen, dass ein Projekt untertyp einen Verweiszähler hochhalten nicht mit sich selbst beendet wird.

    4. HrCreateInnerProj ruft die Implementierung von PreCreateForOuteran. In dieser Methode übernimmt das Projekt untertyp ihre Initialisierung. Sie können Projektmappen von Ereignissen im InitializeForOuterz. B. registrieren.

    5. HrCreateInnerProj wird rekursiv aufgerufen, bis die letzte GUID (das niedrige Projekt) in der Liste erreicht ist. Für jeden dieser Aufrufe werden die Schritte, c, d und wiederholt. pOuter zeigt auf den äußersten Projekt untertyp Aggregationsebene für jede IUnknown .

Im folgenden Beispiel sind der programmgesteuerten Vorgang in einer ungefähren Darstellung der CreateAggregateProject-Methode, da sie von der Umgebung implementiert wird. Der Code ist nur ein Beispiel. Er ist nicht vorgesehen kompiliert, und alle Fehlerüberprüfung wurde aus Gründen der Übersichtlichkeit entfernt.

Beispiel

Code

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);
}

Siehe auch

Referenz

Microsoft.VisualStudio.Shell.Flavor

Weitere Ressourcen

Projekt-Untertypen