[英]CustomVision API returns “Operation returned an invalid status code: 'Bad Request'”
[英]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
包含值-2147483648
或int.MinValue
,这当然是无效的。 我想知道我在这里做错了什么。 我查看了几个网页: GitHub 1 、 GitHub 2和Hot Examples ,但它们似乎与我正在做的相同。
请注意, CurrentHierarchy
代表项目层次结构,而IsFolder
的值实际上是正确的,例如节点实际上是一个文件夹。
在深入挖掘之后,我注意到GetNestedHierarchy
实际上正在返回VSConstants.E_FAIL
这意味着:
如果层次结构对象不支持请求的接口,则返回 Microsoft.VisualStudio.VSConstants.E_NOINTERFACE。 如果请求的接口是必不可少的(当请求的接口是 IID_IVsUIHierarchy 时,通常就是这种情况),调用者会将该节点视为没有子节点。
这甚至让我更加困惑,因为我传递给该方法的节点确实是一个文件夹。
看起来代码工作正常,如果IVsHierarchy
代表一个IVsSolution
,但是一旦我尝试获取嵌套层次结构的嵌套层次结构,它将不再起作用。
我想我在以下几点中为您提供了答案:
在此处设置断点:
var result = CurrentHierarchy.GetNestedHierarchy((uint)(int)tempNode, ref guid, out var hierarchyObjectPointer, out var nested); // Returns invalid status code
然后:
检查 CurrentHierarchy 对象以确保它的 FirstChild 属性值不为 null。 如果它为空,您将获得VSConstants.E_FAIL
的返回值。
检查是否有一个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.