Zveřejnění seznamů symbolů poskytovaných knihovnou správci objektů
Nástroje pro procházení symbolů, Zobrazení tříd, Prohlížeč objektů, Prohlížeč volání a Výsledky hledání symbolů předávají žádosti o nová data správci objektů sady Visual Studio. Správce objektů najde příslušné knihovny a požádá o nové seznamy symbolů. Knihovny reagují poskytnutím požadovaných dat správci objektů sady Visual Studio prostřednictvím IVsSimpleObjectList2 rozhraní. Správce objektů sady Visual Studio volá metody v IVsSimpleObjectList2 rozhraní k získání dat a používá je k naplnění nebo aktualizaci zobrazení nástrojů pro procházení symbolů.
Knihovna může získat požadavky na data při vyvolání nástroje, rozbalení uzlu nebo aktualizace zobrazení. Při prvním vyvolání nástroje pro procházení symbolů správce objektů požádá knihovnu o poskytnutí seznamu nejvyšší úrovně. Když uživatel rozbalí uzel seznamu, poskytuje knihovna seznam podřízených položek pod tímto uzlem. Každý dotaz správce objektů obsahuje index položky, kterou zajímá. Pokud chcete zobrazit nový seznam, musí správce objektů určit, kolik položek je v seznamu, typ položek, jejich názvy, přístupnost a další vlastnosti.
Poznámka:
Následující příklady spravovaného kódu ukazují, jak poskytnout seznamy symbolů prostřednictvím implementace IVsSimpleObjectList2 rozhraní. Správce objektů volá metody v tomto rozhraní a používá získaná data k naplnění nebo aktualizaci nástrojů pro procházení symbolů.
Pro implementaci zprostředkovatele symbolů nativního IVsObjectList2 kódu použijte rozhraní.
Zadání seznamů symbolů správci objektů
Získejte počet položek v seznamu symbolů implementací GetItemCount metody. Následující příklad ukazuje, jak správce objektu získá informace o počtu položek v seznamu.
Získejte informace o kategoriích a atributech dané položky seznamu implementací GetCategoryField2 metody. Kategorie položek jsou zadány ve výčtu LIB_CATEGORY . Následující příklad ukazuje, jak správce objektů získá atributy položek pro danou kategorii.
public int GetCategoryField2(uint index, int Category, out uint pfCatField) { pfCatField = 0; switch ((LIB_CATEGORY)Category) { case LIB_CATEGORY.LC_MEMBERTYPE: pfCatField = (uint)_LIBCAT_MEMBERTYPE.LCMT_METHOD; break; case LIB_CATEGORY.LC_MEMBERACCESS: { Method method = m_Methods.Values[(int)index]; if (method.IsPublic) { pfCatField = (uint)_LIBCAT_MEMBERACCESS.LCMA_PUBLIC; } else if (method.IsPrivate) { pfCatField = (uint)_LIBCAT_MEMBERACCESS.LCMA_PRIVATE; } else if (method.IsFamily) { pfCatField = (uint)_LIBCAT_MEMBERACCESS.LCMA_PROTECTED; } else if (method.IsFamilyOrAssembly) { pfCatField = (uint)_LIBCAT_MEMBERACCESS.LCMA_PROTECTED | (uint)_LIBCAT_MEMBERACCESS.LCMA_PACKAGE; } else { // Show everything else as internal. pfCatField = (uint)_LIBCAT_MEMBERACCESS.LCMA_PACKAGE; } } break; case LIB_CATEGORY.LC_VISIBILITY: pfCatField = (uint)_LIBCAT_VISIBILITY.LCV_VISIBLE; break; case LIB_CATEGORY.LC_LISTTYPE: pfCatField = (uint)_LIB_LISTTYPE.LLT_MEMBERS; break; default: return Microsoft.VisualStudio.VSConstants.S_FALSE; } return Microsoft.VisualStudio.VSConstants.S_OK; }
Získejte textovou reprezentaci dané položky seznamu implementací GetTextWithOwnership metody. Následující příklad ukazuje, jak získat úplný název dané položky.
public int GetTextWithOwnership([System.Runtime.InteropServices.ComAliasNameAttribute("Microsoft.VisualStudio.OLE.Interop.ULONG")] uint index, [System.Runtime.InteropServices.ComAliasNameAttribute("Microsoft.VisualStudio.Shell.Interop.VSTREETEXTOPTIONS")] Microsoft.VisualStudio.Shell.Interop.VSTREETEXTOPTIONS tto, [System.Runtime.InteropServices.ComAliasNameAttribute("Microsoft.VisualStudio.OLE.Interop.WCHAR")] out string ppszText) { ppszText = m_Methods.Values[(int)index].FullName; return Microsoft.VisualStudio.VSConstants.S_OK; }
Získejte informace o ikoně pro danou položku seznamu implementací GetDisplayData metody. Ikona představuje typ (třída, metoda atd.) a přístupnost (soukromá, veřejná atd.) položky seznamu. Následující příklad ukazuje, jak získat informace o ikoně na základě daného atributu položky.
public virtual int GetDisplayData(uint index, Microsoft.VisualStudio.Shell.Interop.VSTREEDISPLAYDATA[] pData) { if (pData == null) { return Microsoft.VisualStudio.VSConstants.E_INVALIDARG; } Method method = m_Methods.Values[(int)index]; int iImage = 12 * 6; // See env\inc\OMGlyphs.h. const int OM_GLYPH_ACC_PUBLIC = 0; const int OM_GLYPH_ACC_INTERNAL = 1; const int OM_GLYPH_ACC_PROTECTED = 3; const int OM_GLYPH_ACC_PRIVATE = 4; if (method.IsPublic) { iImage += OM_GLYPH_ACC_PUBLIC; } else if (method.IsPrivate) { iImage += OM_GLYPH_ACC_PRIVATE; } else if (method.IsFamily) { iImage += OM_GLYPH_ACC_PROTECTED; } else if (method.IsFamilyOrAssembly) { iImage += OM_GLYPH_ACC_PROTECTED; } else { iImage += OM_GLYPH_ACC_INTERNAL; } pData[0].Image = (ushort)iImage; pData[0].SelectedImage = (ushort)iImage; return Microsoft.VisualStudio.VSConstants.S_OK; }
Získejte informace o tom, zda je daná položka seznamu rozbalitelná implementací GetExpandable3 metody. Následující příklad ukazuje, jak získat informace o tom, zda dané položky lze rozšířit.
public int GetExpandable(uint index, out int pfExpandable) { pfExpandable = Microsoft.VisualStudio.VSIP.Samples.CallBrowser.Constants.TRUE; return Microsoft.VisualStudio.VSConstants.S_OK; } public int GetExpandable3(uint index, uint ListTypeExcluded, out int pfExpandable) { return GetExpandable(index, out pfExpandable); }
Získejte podřízený seznam symbolů dané položky seznamu implementací GetList2 metody. Následující příklad ukazuje, jak získat podřízený seznam symbolů dané položky pro grafy Volání nebo Volající .
// Call graph list. public class CallsList : ResultsList, Microsoft.VisualStudio.Shell.Interop.IVsSimpleObjectList2 { public CallsList(Library library) : base(library) { } public int GetList2(uint index, uint ListType, uint flags, Microsoft.VisualStudio.Shell.Interop.VSOBSEARCHCRITERIA2[] pobSrch, out Microsoft.VisualStudio.Shell.Interop.IVsSimpleObjectList2 ppList) { return base.GetCallsList(index, out ppList); } } // Callers graph list. public class CallersList : ResultsList, Microsoft.VisualStudio.Shell.Interop.IVsSimpleObjectList2 { public CallersList(Library library) : base(library) { } public int GetList2(uint index, uint ListType, uint flags, Microsoft.VisualStudio.Shell.Interop.VSOBSEARCHCRITERIA2[] pobSrch, out Microsoft.VisualStudio.Shell.Interop.IVsSimpleObjectList2 ppList) { return base.GetCallersList(index, out ppList); } } // Call graph list. public int GetCallsList(uint index, out Microsoft.VisualStudio.Shell.Interop.IVsSimpleObjectList2 ppList) { ppList = null; ResultsList callsList = new CallsList(m_Library); Method method = m_Methods.Values[(int)index]; string strMethod = method.m_strPrototype; System.Collections.Generic.List<CallInstance> Calls = m_Library.CallGraph.GetCallGraph(method); for (int i = 0; i < Calls.Count; i++) { Method caller = Calls[i].m_Target; callsList.AddMethod(caller); } ppList = (Microsoft.VisualStudio.Shell.Interop.IVsSimpleObjectList2)(callsList); return Microsoft.VisualStudio.VSConstants.S_OK; } // Callers graph list. public int GetCallersList(uint index, out Microsoft.VisualStudio.Shell.Interop.IVsSimpleObjectList2 ppList) { ppList = null; ResultsList callersList = new CallersList(m_Library); Method method = m_Methods.Values[(int)index]; string strMethod = method.m_strPrototype; System.Collections.Generic.List<CallInstance> Callers = m_Library.CallGraph.GetCallersGraph(method); for (int i = 0; i < Callers.Count; i++) { Method caller = Callers[i].m_Source; callersList.AddMethod(caller); } ppList = (Microsoft.VisualStudio.Shell.Interop.IVsSimpleObjectList2)(callersList); return Microsoft.VisualStudio.VSConstants.S_OK; } // Get a child list of symbols for a given list item. public int GetList2(uint index, uint ListType, uint flags, Microsoft.VisualStudio.Shell.Interop.VSOBSEARCHCRITERIA2[] pobSrch, out Microsoft.VisualStudio.Shell.Interop.IVsSimpleObjectList2 ppList) { ppList = null; Method method = m_Methods.Values[(int)index]; string strMethod = method.m_strPrototype; // Determine if the list belongs to Call or Callers graphs. if ((uint)(m_nFlags & (uint)Microsoft.VisualStudio.Shell.Interop._VSOBSEARCHOPTIONS2.VSOBSO_CALLSFROM) > 0) { // Build the list for the Call graph. return base.GetCallsList(index, out ppList); } else if ((uint)(m_nFlags & (uint)Microsoft.VisualStudio.Shell.Interop._VSOBSEARCHOPTIONS2.VSOBSO_CALLSTO) > 0) { // Build the list for the Callers graph. return base.GetCallersList(index, out ppList); } return Microsoft.VisualStudio.VSConstants.E_FAIL; }