라이브러리에서 제공하는 기호 목록을 개체 관리자에 노출
기호 검색 도구인 클래스 뷰, 개체 브라우저, 호출 브라우저 및 기호 결과 찾기는 Visual Studio 개체 관리자에 새 데이터에 대한 요청을 전달합니다. 개체 관리자는 적절한 라이브러리를 찾고 새로운 기호 목록을 요청합니다. 라이브러리는 IVsSimpleObjectList2 인터페이스를 통해 Visual Studio 개체 관리자에 요청된 데이터를 제공하여 응답합니다. Visual Studio 개체 관리자는 IVsSimpleObjectList2 인터페이스의 메서드를 호출하여 데이터를 가져오고 이를 사용하여 기호 검색 도구의 보기를 채우거나 업데이트합니다.
라이브러리는 도구가 호출되거나, 노드가 확장되거나, 보기가 새로 고쳐질 때 데이터 요청을 받을 수 있습니다. 심볼 검색 도구가 처음 호출되면 개체 관리자는 라이브러리에 최상위 목록을 제공하도록 요청합니다. 사용자가 목록 노드를 확장하면 라이브러리는 해당 노드 아래에 자식 목록을 제공합니다. 모든 개체 관리자 조회에는 관심 항목의 인덱스가 포함됩니다. 새 목록을 표시하려면 개체 관리자가 목록에 있는 항목 수, 항목 유형, 이름, 접근성 및 기타 속성을 결정해야 합니다.
참고 항목
다음 관리 코드 예제에서는 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 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; }