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

问题描述 投票:0回答:1

基本上,我正在尝试获取项目中文件夹的嵌套层次结构。在下面,您可以看到我的代码的简化版本,在这里我是层次结构的第一个节点,即文件夹。

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时就是这种情况)。

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

c# visual-studio visual-studio-2019 vsix
1个回答
0
投票

我想我在这些要点中为您提供了答案:

在此处设置断点:

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

然后:

  1. 检查CurrentHierarchy对象,以确保其FirstChild属性值不为null。如果为null,则返回值为VSConstants.E_FAIL

  2. 检查具有ID值等于您传入的uint tempNode值的节点的整个层次结构。如果没有节点ID与tempNode值匹配,则返回返回值VSConstants.E_FAIL

以上帮助吗?

© www.soinside.com 2019 - 2024. All rights reserved.