繁体   English   中英

获取嵌套层次结构返回无效的状态代码

[英]Getting Nested Hierarchy returns invalid status code

基本上,我试图获取项目中文件夹的嵌套层次结构。 在下面,您可以看到我的代码的简化版本,其中我采用了层次结构的第一个节点,它是一个文件夹。

CurrentHierarchy.GetProperty(VSConstants.VSITEMID_ROOT, (int)__VSHPROPID.VSHPROPID_FirstVisibleChild, out var tempNode);

if (IsFolder)
{
    var guid = typeof(IVsHierarchy).GUID;

    var result = CurrentHierarchy.GetNestedHierarchy((uint)(int)tempNode, ref guid, out var hierarchyObjectPointer, out var nested); // Returns invalid status code

    var hierarchy = (IVsHierarchy)Marshal.GetObjectForIUnknown(hierarchyObjectPointer);
    Marshal.Release(hierarchyObjectPointer);
}

无论如何,变量result包含值-2147483648int.MinValue ,这当然是无效的。 我想知道我在这里做错了什么。 我查看了几个网页: GitHub 1GitHub 2Hot Examples ,但它们似乎与我正在做的相同。

请注意, CurrentHierarchy代表项目层次结构,而IsFolder的值实际上是正确的,例如节点实际上是一个文件夹。


编辑

在深入挖掘之后,我注意到GetNestedHierarchy实际上正在返回VSConstants.E_FAIL这意味着:

如果层次结构对象不支持请求的接口,则返回 Microsoft.VisualStudio.VSConstants.E_NOINTERFACE。 如果请求的接口是必不可少的(当请求的接口是 IID_IVsUIHierarchy 时,通常就是这种情况),调用者会将该节点视为没有子节点。

这甚至让我更加困惑,因为我传递给该方法的节点确实是一个文件夹。


编辑 2

看起来代码工作正常,如果IVsHierarchy代表一个IVsSolution ,但是一旦我尝试获取嵌套层次结构的嵌套层次结构,它将不再起作用。

我想我在以下几点中为您提供了答案:

在此处设置断点:

var result = CurrentHierarchy.GetNestedHierarchy((uint)(int)tempNode, ref guid, out var hierarchyObjectPointer, out var nested); // Returns invalid status code

然后:

  1. 检查 CurrentHierarchy 对象以确保它的 FirstChild 属性值不为 null。 如果它为空,您将获得VSConstants.E_FAIL的返回值。

  2. 检查是否有一个ID值等同于你在传递的UINT tempNode值的节点的整个层次,如果没有节点ID tempNode值相匹配,然后得到一个返回值VSConstants.E_FAIL

以上有帮助吗?

这整个事情实际上比最初预期的要容易得多。 我实际上很想了解GetNestedHierarchy的使用以及整个原理。 所以让我为其他人解释一下。

乍一看,您可能认为文件夹和任何可扩展的节点都是层次结构,但事实并非如此!

什么是层次结构? 实际上,从我的测试来看,层次结构只是一个解决方案和一个项目仅此而已 因此,如果您想获取项目文件夹中的项目,则需要通过反复调用GetProperty来获取每个子项。

hierarchy.GetProperty(folderItemId, (int)__VSHPROPID.VSHPROPID_FirstChild, out var folderItem);
hierarchy.GetProperty(folderItem, (int)__VSHPROPID.VSHPROPID_FirstChild, out var folderItemItem);

基本上,项目IVsHierarchy承载了项目中的所有项目。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM