ライブラリによって提供されるシンボルのリストをオブジェクト マネージャーに公開する
シンボル参照ツールである [クラス ビュー]、[オブジェクト ブラウザー]、[呼び出しブラウザー]、[シンボルの検索結果] から Visual Studio オブジェクト マネージャーに新しいデータの要求が渡されます。 オブジェクト マネージャーでは、適切なライブラリを検索し、シンボルの新しいリストを要求します。 ライブラリでは、Visual Studio インターフェイスを介して要求されたデータを IVsSimpleObjectList2 オブジェクト マネージャーに提供することによって応答します。 Visual Studio オブジェクト マネージャーでは、IVsSimpleObjectList2 インターフェイスのメソッドを呼び出してデータを取得し、それを使用してシンボル参照ツールのビューを設定または更新します。
ライブラリでは、ツールが呼び出されたとき、ノードが展開されたとき、またはビューが更新されたときに、データの要求を取得することがあります。 シンボル参照ツールが初めて呼び出されるとき、オブジェクト マネージャーでは、最上位レベルのリストを提供するようにライブラリに要求します。 ユーザーがリスト ノードを展開すると、そのノードの下にある子のリストがライブラリに表示されます。 各オブジェクト マネージャーの問い合わせには、目的の項目のインデックスが含まれています。 新しいリストを表示するには、オブジェクト マネージャーによってリスト内の項目の数、項目の種類、名前、アクセシビリティ、およびその他のプロパティが確認される必要があります。
Note
次のマネージド コード例は、IVsSimpleObjectList2 インターフェイスの実装によってシンボルのリストを提供する方法を示しています。 オブジェクト マネージャーでは、このインターフェイスのメソッドを呼び出し、取得したデータを使用してシンボル参照ツールを設定または更新します。
ネイティブ コード シンボル プロバイダーの実装の場合は、IVsObjectList2 インターフェイスを使用します。
オブジェクト マネージャーにシンボルのリストを提供するには
GetItemCount メソッドを実装して、シンボルのリスト内にある項目の数を取得します。 次の例は、オブジェクト マネージャーでリスト内にある項目の数に関する情報を取得する方法を示しています。
GetCategoryField2 メソッドを実装することによって、指定されたリスト項目のカテゴリおよび属性に関する情報を取得します。 項目カテゴリは LIB_CATEGORY 列挙体で指定されます。 次の例は、オブジェクト マネージャーで特定カテゴリの項目の属性を取得する方法を示しています。
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; }
GetTextWithOwnership メソッドを実装して、指定されたリスト項目のテキスト表現を取得します。 次の例は、指定された項目の完全名を取得する方法を示しています。
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; }
GetDisplayData メソッドを実装して、指定されたリスト項目のアイコン情報を取得します。 アイコンは、リスト項目の型 (クラス、メソッドなど) とアクセシビリティ (プライベート、パブリックなど) を表します。 次の例は、特定の項目属性に基づいてアイコン情報を取得する方法を示しています。
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; }
GetExpandable3 メソッドを実装することによって、特定のリスト項目が展開可能かどうかに関する情報を取得します。 次の例は、特定の項目を展開できるかどうかに関する情報を取得する方法を示しています。
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); }
GetList2 メソッドを実装して、指定されたリスト項目のシンボルの子リストを取得します。 次の例は、Call または Callers グラフの特定項目のシンボルの子リストを取得する方法を示しています。
// 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; }