当用户在Windows资源管理器中导航到例如他的Android手机的SD卡上的文件夹时,资源管理器会显示一种痕迹路径,就像"This PC\Galaxy Tab A\Card\Folder1"在地址栏中单击一样.
在地址栏中输入或复制它们并按回车键时,Windows资源管理器也接受这些路径.
我想知道是否有办法使用Shell API解析这些面包屑路径并获得PItemIDList或IShellItem作为回报.到目前为止,我没有成功使用eg SHParseDisplayName().这段代码
LPITEMIDLIST itemidlist;
HRESULT hr = SHParseDisplayName(L"This PC\\Galaxy Tab A\\Card\\testfolder", NULL, &itemidlist, 0, NULL);
Run Code Online (Sandbox Code Playgroud)
回来0x80070002了HRESULT.
问题SHParseDisplayName当路径不存在这样一个问题涉及如何使用IBindCtx解析到一个并不存在的文件的路径.这可以使用STR_FILE_SYS_BIND_DATA绑定上下文来完成.但是移动设备上的对象不是文件系统数据,而且它们已经存在,所以我不明白为什么这是重复的.
我们最近遇到了一个问题,TDictionary<T>即无法正确查找已包含在字典中的项目.该问题仅发生在64位版本中.我能够将问题分解为这段代码:
var
i1, i2: TPair<Int64,Integer>;
begin
FillMemory(@i1, sizeof(i1), $00);
FillMemory(@i2, sizeof(i1), $01);
i1.Key := 2;
i1.Value := -1;
i2.Key := i1.Key;
i2.Value := i1.Value;
Assert(TEqualityComparer<TPair<Int64,Integer>>.Default.Equals(i1, i2));
Assert(TEqualityComparer<TPair<Int64,Integer>>.Default.GetHashCode(i1) = TEqualityComparer<TPair<Int64,Integer>>.Default.GetHashCode(i2));
end;
Run Code Online (Sandbox Code Playgroud)
断言在Win64版本中失败.由于记录对齐,似乎会出现问题:此TPair的大小为16个字节,但只有12个字节用数据填充.该TEqualityComparer然而通吃16个字节考虑.所以2个记录值可能被视为不相等,尽管所有成员都相等,只是因为内存的先前内容不同
这可以被视为设计中的错误或行为吗?无论如何,这是一个陷阱.这种情况的最佳解决方案是什么?
作为解决方法,可以使用NativeInt而不是Integer,但是这种Integer类型不在我们的控制之下.